多重继承的问题
class ClxBaseA
{
public:
ClxBaseA() {};
~ClxBaseA()
{
cout << "Output from the destructor of class ClxBaseA!" << endl;
}
void DoSomething() { cout << "Do something in class ClxBaseA!" << endl; };
};
class ClxBaseB
{
public:
ClxBaseB() {};
virtual ~ClxBaseB()
{
cout << "Output from the destructor of class ClxBaseB!" << endl;
};
virtual void DoSomething() { cout << "Do something in class ClxBaseB!" << endl; };
};
class ClxDerived : public ClxBaseA,public ClxBaseB
{
public:
ClxDerived() {};
~ClxDerived()
{
cout << "Output from the destructor of class ClxDerived!" << endl;
}
void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};
int _tmain(int argc, _TCHAR* argv[])
{
ClxBaseB* pBaseB = new ClxDerived;
pBaseB->DoSomething();
delete pBaseB;
ClxBaseA* pBaseA = new ClxDerived;
pBaseA->DoSomething();
delete pBaseA;
return 0;
}
请牛人解答为什么程序崩溃?
[解决办法]
除了内存泄露以外么看出什么问题。
试试在release模式下是否还有这个现象。
[解决办法]
很明显
~ClxBaseA()
这个析构函数不是虚函数呀。
ClxBaseA* pBaseA = new ClxDerived;
pBaseA->DoSomething();
delete pBaseA;
就无法正确的释放ClxDerived的内存空间了,所以报错了。
把ClxBaseA的析构函数,前加个virtual变成虚函数,即可
[解决办法]
不加virtual的话,就只能释放ClxDerived的ClxBaseA类子对象,如果加的话,就走虚函数机制调用ClxDerived的析构函数,从而正常的释放对象
[解决办法]
这个根本不需要涉及virtual的实现就可以解释了,你的析构不是virtual,那么你用指针析构derived class的object就是非常危险的事情
[解决办法]
有兴趣可以看看
不要陷入的太深,知道有这么个事情就够了,这些东西都不是学习的重点。以标准为中心。