关于virtual虚函数大家好,请看以下代码:C/C++ code#includeiostreamusing namespace stdclass ClxBase{
关于virtual虚函数
大家好,请看以下代码:
- C/C++ code
#include<iostream>using namespace std;class ClxBase{ public: ClxBase() {}; virtual ~ClxBase() { cout << "~ClxBase " << endl; }; virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };};class ClxDerived : public ClxBase{ public: ClxDerived(): ClxBase() {}; ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };};int main(){ ClxBase *pTest = new ClxDerived; delete pTest; pTest = NULL; return 0;}~请问三个问题:
1.析构函数~ClxBase是virtual ,为什么pTest调用的不是派生类的析构函数,却是基类的析构函数呢?
2.如果把析构函数改成“virtual ~ClxBase() {};”,为什么输出结果不一样?
3.如何能够做到既调用基类的析构函数,又调用派生类的析构函数呢?
谢谢!
[解决办法]
输出结果是
Output from the destructor of class ClxDerived!
~ClxBase
先调用子类 再调用基类
你看错结果了吧
[解决办法]
1 delete pTest 先调用派生类析构函数,在调用基类的析构函数;
2 这么写就看不到输出调用基类析构函数那句话了,因为你没有输出那句话;
3 只要定义派生类对象,在析构的时候两个析构函数都会调用
[解决办法]
楼上正解
[解决办法]
[解决办法]
[解决办法]
#3楼正解。
[解决办法]
[解决办法]
[解决办法]
[解决办法]
[解决办法]
[解决办法]
的确,只要把基类的析构函数声明为虚函数后,那么派生类的析构函数就都是虚函数了
[解决办法]
楼主,你的代码本身就是既可以调用基类的析构函数,又可以调用派生类的析构函数呢。因为你的那个基类的析构函数是虚函数,如果你木有把基类的析构函数声明为虚函数的话,就只会调用基类的析构函数,而不会调用派生类的析构函数。。。
[解决办法]
楼主你的代码本身既可以调用基类的析构函数,又可以调用派生类的析构函数呢。因为你把基类的析构函数声明了虚函数的原因,如果你木有把基类的析构函数声明为虚函数的话,那么析构的时候,就只会调用基类的析构函数,而不会调用派生类的析构函数
[解决办法]
你怎么每个函数后加个分号哦, 这样写别人会认为你不懂语法的, 就像在函数宏后加分号一样会被pass的
