关于多重继承和虚拟继承

时间:2015-06-19 13:42:33

标签: c++ inheritance

我不太了解多重继承和虚拟继承。请帮助我。这是我的小测试:

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 个答案:

答案 0 :(得分:1)

您的第一段代码具有虚拟继承解决的确切问题:您的继承层次结构中有一个菱形。 Test21Test22都继承自Test1,因此当您从这两个版本继承时,您实际上会在层次结构中获得两个版本的Test1 ,所以你想使用哪一个是模棱两可的。

解决方案,在您的第二个示例中:几乎从Test1继承,以便您只获得一个版本。

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

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

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

您应该在类中添加虚拟析构函数:

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