我不太了解多重继承和虚拟继承。请帮助我。这是我的小测试:
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!
有人能解释一下多重继承和虚拟继承吗?
答案 0 :(得分:1)
您的第一段代码具有虚拟继承解决的确切问题:您的继承层次结构中有一个菱形。 Test21
和Test22
都继承自Test1
,因此当您从这两个版本继承时,您实际上会在层次结构中获得两个版本的Test1
,所以你想使用哪一个是模棱两可的。
解决方案,在您的第二个示例中:几乎从Test1
继承,以便您只获得一个版本。
但是,您的代码具有未定义的行为。
Test1 * t1 = new Test3();
delete t1;
通过指向没有虚析构函数的基类的指针删除派生实例。这意味着Test3
对象未被正确销毁。
您应该在类中添加虚拟析构函数:
virtual ~Test1() = default; //c++11
virtual ~Test1() {}; //prior version