`

C++虚析构和java的override

 
阅读更多

刚刚在CSDN上看到了一道C++找错题题目如下:

 

  1. [code=C/C++][/code]
  2. classA
  3. {
  4. public:
  5. A(){}
  6. ~A(){}
  7. };
  8. classB:publicA
  9. {
  10. public:
  11. B(){}
  12. ~B(){}
  13. };
  14. intmain()
  15. {
  16. A*p=newB;
  17. deletep;
  18. p=0;
  19. return0;
  20. }

问题出现在哪里? 问题是当执行delete p的时候,执行了仅仅是执行了~A{}这个函数,而没有执行~B(){}这个函数。

解决方法是将~A{}变为虚析构函数,virtual ~A{} 為什麼呢?

==========

我之前是学习java的 在java中如果是这种情况我之前遇到过 ,当然我执行的不是析构函数,如下:

 

  1. classA{
  2. publicvoidmethod1(){
  3. }
  4. publicvoidmethod2(){
  5. }
  6. }
  7. classBextendsA{
  8. publicvoidmethod1(){
  9. }
  10. @override
  11. publicvoidmethod2(){
  12. }
  13. }

 

  1. Aa=newB();
  2. a.method1();
  3. a.method2();

这个时候a.method1()执行的其实是A中的method1方法,然而a.method2()执行的确实B中的method2()方法,为什么呢? 因为method2方法签名上面加上了注解(Annotation) @override 这样就达到重写的效果。 其实eclipse 完全可以自动给你加上。

=====

 

C++ Java

虚函数 -------- 普通函数

纯虚函数 -------- 抽象函数

抽象类 -------- 抽象类

虚基类 -------- 接口


=========

回到上个C++的问题 ,其实是一个道理。 明白了了吗?各位

分享到:
评论

相关推荐

    JAVA和C++实现面向对象方法的分析.zip

    1. 类与对象:C++同样使用类来定义对象,但与Java不同的是,C++允许类的私有成员在类外进行初始化,且提供了构造函数和析构函数,用于对象的初始化和清理工作。 2. 封装:C++通过成员访问控制(public, protected, ...

    精选C、C++、JAVA编程规范

    在编程世界中,C、C++和JAVA是三门极具影响力的编程语言,广泛应用于系统级开发、游戏引擎、服务器端应用以及移动应用等多个领域。为了提高代码质量、可读性和可维护性,遵循一定的编程规范至关重要。本资料精选了这...

    java面试题目精华

    虚函数在C++中允许子类重写父类的方法,Java中类似的概念是`abstract`方法和`@Override`注解。 6. **Error与Exception**:Error是程序无法处理的严重问题,比如系统崩溃或JVM故障,而Exception是程序可以捕获和处理...

    java 面试题整理

    9. **虚析构器**和**虚构造器**:虚析构器在C++中确保基类的析构函数在派生类析构时也能被调用,保证资源的正确释放。而Java中没有构造器的概念,所以不存在虚构造器。 10. **方法不能基于不同的返回类型但相同的...

    C++中的virtuals

    在C++编程中,`virtual`关键字是实现多态性(Polymorphism)的关键机制,这对于理解和编写面向对象的代码至...理解并熟练运用`virtual`函数、构造函数和析构函数的特性,以及继承和重写,是掌握C++面向对象编程的基础。

    CoreJava 新手必

    Java和C++各有优缺点,Java更注重安全性、跨平台性和内存管理,而C++则提供更低级别的控制和更高的性能。 J2SE、J2EE和J2ME分别对应桌面应用、企业级应用和服务端嵌入式应用。J2SE是基础,J2EE用于开发大型分布式...

    java kok 构造与析构函数

    "卡拉OK表字段.doc"可能涉及数据库设计,而"Util.js"可能是JavaScript的实用工具库,与Java的构造函数和析构函数主题关系不大。 总的来说,理解和掌握构造函数、析构函数(以及在Java中的`finalize()`方法)、函数...

    Java经典问答

    Java和C++都是面向对象的语言,但Java更注重安全性、跨平台性和内存管理,而C++则提供了更低级别的控制。J2SE是标准版,用于桌面应用;J2EE针对企业级应用;J2ME适用于嵌入式设备。 编写Java程序后,使用javac命令...

    达内培训(Java面试题)

    **题目**:简述C++中继承、虚函数、纯虚函数的概念和用法。 **解析**: - **继承**:是一种机制,允许一个类(派生类)继承另一个类(基类)的特性。继承支持代码复用,减少重复代码。 - **虚函数**:虚函数是用来...

    Cpp面经200问.pdf

    构造函数、析构函数和虚函数内联 构造函数、析构函数可以声明为内联函数,但虚函数通常不声明为内联,因为虚函数需要通过虚表机制实现。 #### 41. auto、decltype和decltype(auto)用法 auto用于自动类型推导,根据...

    C++设计类不能被继承的方法实例讲解

    在C++中,如果一个类的构造函数和析构函数都被声明为私有的,那么其他类将无法直接创建或销毁这个类的实例。这是因为构造函数和析构函数在创建和销毁对象时会被调用,而私有成员函数只允许在类内部访问。为了仍然...

    OOP_java_tasks

    Java中没有像C++那样的析构器,但在 finalize() 方法中可以实现类似的功能,用于清理对象不再使用时的资源。 9. 访问控制修饰符: `public` - 可被任何类访问。 `protected` - 可被同一包内的类和不同包的子类...

    c#基础知识以及学习资料《c#编程百例》

    - C#的语句结构类似于C++和Java,包括变量声明、赋值、条件语句(if-else)、循环(for、while、foreach)和跳转语句(break、continue)。 - 注释分为单行注释(//)和多行注释(/*...*/)。 2. **数据类型**: ...

    c#系列教程(pdf)

    - 它结合了C++的性能和Java的易用性,同时引入了许多现代编程语言的特性,如垃圾回收、强类型检查和XML支持。 - **C#语言的特点** - C#支持面向对象编程,包括封装、继承和多态。 - 它拥有简洁的语法,易于学习...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    无论是刚开始接触面向对象编程的新手,还是打算转移到c#的具有c,c++或者java基础的程序员,都可以从本书中吸取到新的知识。 作译者 john sharp,content master首席技术专家。content master隶属于cm集团,cm集团...

    C#语言基础

    它结合了多种语言的优点,如C++的强大功能与Java的安全性和易用性。 - **面向对象**:支持封装、继承和多态。 - **安全性**:内置安全机制,防止常见的编程错误。 - **性能**:运行在.NET Framework或.NET Core上,...

    Lab2

    C#结合了C++和Java的一些特性,同时也引入了许多新的概念和功能,使得它成为开发高效、可靠软件的理想选择。 C#的关键特性包括: 1. **面向对象**:C#是基于面向对象编程(OOP)的,支持类、接口、继承、多态等...

Global site tag (gtag.js) - Google Analytics