2015-06-19 221 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