2015-06-19 45 views
2

我不太了解多继承和虚继承。 PLZ帮助我。这里是我的小测试:
关于多继承和虚继承

class Test1 
{}; 

class Test21 : public Test1 
{}; 

class Test22 : public Test1 
{}; 

class Test3 : public Test21, public Test22 
{}; 

int main() 
{ 
    Test1 * t1 = new Test3(); 
    delete t1; 

    system("pause>NUL"); 
    return 0; 
} 

我得到了一个错误:Error 1 error C2594: 'initializing' : ambiguous conversions from 'Test3 *' to 'Test1 *'
为什么?

然后我试图像这样:

class Test1 
    {}; 

    class Test21 : virtual public Test1 
    {}; 

    class Test22 : virtual public Test1 
    {}; 

    class Test3 : public Test21, public Test22 
    {}; 

    int main() 
    { 
     Test1 * t1 = new Test3(); 
     delete t1; 

     system("pause>NUL"); 
     return 0; 
    } 

现在,我得到另一个错误:Debug Assertion Failed!

能有人给我解释一下关于多重继承和虚拟继承?

回答

1

您的第一段代码具有虚拟继承解决的确切问题:您的继承层次结构中有菱形。 Test21Test22都从Test1继承,所以当你从它们两个继承时,你实际上在你的层次结构中得到了两个版本的Test1,所以它对于你希望使用哪一个版本是不明确的。

该解决方案在您的第二个示例中:实际上从Test1继承,以便您获得单个版本。

但是,您的代码具有未定义的行为。

Test1 * t1 = new Test3(); 
delete t1; 

您可以通过指向没有虚拟析构函数的基类的指针来删除派生实例。这意味着Test3对象未被正确销毁。

你应该虚析构函数添加到您的类:

virtual ~Test1() = default; //c++11 
virtual ~Test1() {}; //prior version