关于virtual虚函数解决方法

关于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 只要定义派生类对象,在析构的时候两个析构函数都会调用
[解决办法]
楼上正解
[解决办法]
探讨

1 delete pTest 先调用派生类析构函数,在调用基类的析构函数;
2 这么写就看不到输出调用基类析构函数那句话了,因为你没有输出那句话;
3 只要定义派生类对象,在析构的时候两个析构函数都会调用

[解决办法]
探讨

引用:

1 delete pTest 先调用派生类析构函数,在调用基类的析构函数;
2 这么写就看不到输出调用基类析构函数那句话了,因为你没有输出那句话;
3 只要定义派生类对象,在析构的时候两个析构函数都会调用

最好把你的子类的析构函数也申明为虚函数

[解决办法]
#3楼正解。
[解决办法]
探讨

引用:

引用:

1 delete pTest 先调用派生类析构函数,在调用基类的析构函数;
2 这么写就看不到输出调用基类析构函数那句话了,因为你没有输出那句话;
3 只要定义派生类对象,在析构的时候两个析构函数都会调用

最好把你的子类的析构函数也申明为虚函数

为什么???

[解决办法]
探讨

引用:

引用:

1 delete pTest 先调用派生类析构函数,在调用基类的析构函数;
2 这么写就看不到输出调用基类析构函数那句话了,因为你没有输出那句话;
3 只要定义派生类对象,在析构的时候两个析构函数都会调用

最好把你的子类的析构函数也申明为虚函数

为什么???

[解决办法]
探讨
引用:

1 delete pTest 先调用派生类析构函数,在调用基类的析构函数;
2 这么写就看不到输出调用基类析构函数那句话了,因为你没有输出那句话;
3 只要定义派生类对象,在析构的时候两个析构函数都会调用

最好把你的子类的析构函数也申明为虚函数

[解决办法]
探讨

引用:

1 delete pTest 先调用派生类析构函数,在调用基类的析构函数;
2 这么写就看不到输出调用基类析构函数那句话了,因为你没有输出那句话;
3 只要定义派生类对象,在析构的时候两个析构函数都会调用

最好把你的子类的析构函数也申明为虚函数

[解决办法]
探讨

1 delete pTest 先调用派生类析构函数,在调用基类的析构函数;
2 这么写就看不到输出调用基类析构函数那句话了,因为你没有输出那句话;
3 只要定义派生类对象,在析构的时候两个析构函数都会调用

[解决办法]
的确,只要把基类的析构函数声明为虚函数后,那么派生类的析构函数就都是虚函数了
[解决办法]
楼主,你的代码本身就是既可以调用基类的析构函数,又可以调用派生类的析构函数呢。因为你的那个基类的析构函数是虚函数,如果你木有把基类的析构函数声明为虚函数的话,就只会调用基类的析构函数,而不会调用派生类的析构函数。。。
[解决办法]
楼主你的代码本身既可以调用基类的析构函数,又可以调用派生类的析构函数呢。因为你把基类的析构函数声明了虚函数的原因,如果你木有把基类的析构函数声明为虚函数的话,那么析构的时候,就只会调用基类的析构函数,而不会调用派生类的析构函数
[解决办法]
你怎么每个函数后加个分号哦, 这样写别人会认为你不懂语法的, 就像在函数宏后加分号一样会被pass的