如下:虚基类未定义或者未显示定义带有virtual关键字的析构函数,则析构时只进行到基类析构
修改方式:基类的析构函数加上virtual ; 子类的析构函数加上override ,使之建立继承关系
class TestBase
{
public:
//
~TestBase() { std::cout << "delete BASE " << std::endl; }
virtual bool testValid() const=0;
};
class Test0 : public TestBase
{
public:
Test0(int n) { m_n = n; }
~Test0() { std::cout << "delete test0 " << std::endl; }
private:
bool testValid() const override
{
return m_n % 2 > 0;
}
int m_n;
};
class Test1 : public TestBase
{
public:
Test1(int n) { m_n = n; }
~Test1() { std::cout << "delete test1 " << std::endl; }
private:bool testValid() const override
{
return m_n % 2 == 0;
}
int m_n;
};
bool Func(int n) {
bool bSuc = false;
if (n % 2 > 0)
{
TestBase* testBase0 = new Test0(n); bSuc = testBase0->testValid();
delete testBase0;
}
else
{
TestBase* testBase1 = new Test1(n);
bSuc = testBase1->testValid();
delete testBase1;
}
return bSuc;
}
int main() {
bool SUC = Func(20);
SUC = Func(21);
return 0;
}
当前输出结果是:
delete BASE
delete BASE
修改方式:基类析构函数加上virtual ; 子类析构函数加上override ,建立继承关系
正确输出结果是:
delete test1
delete BASE
delete test0
delete BASE
补充学习知识 C++ 虚函数表解析