據我所知,虛擬確保基類的屬性只有一份被繼承到派生類中。在多重繼承中,首先呼叫所有基類的建構式,然后呼叫派生類的建構式。在下面的代碼中,為什么B類的建構式被連續呼叫了兩次?根據我的理解,輸出應該是
。B
B1
B2
D
但輸出結果是
B
B
B1
B2
D
下面是完整的代碼。
#include <iostream>
class B
{
public:
B(){std::cout << "B" << std::endl;}.
};
class B1:public B
{
public:
B1(){std::cout << "B1" << std::endl;}.
};
class B2:virtual public B
{
public:
B2(){std::cout << "B2" << std::endl;}.
};
class D:public B1,public B2
{
public:
D(){std::cout << "D" << std::endl;}.
};
int main()
{
D d1;
uj5u.com熱心網友回復:
B1對B的繼承也必須是虛擬的。
虛擬繼承并不意味著 "在層次結構的其他部分尋找這個類的繼承實體",它意味著 "在這個層次結構的所有虛擬繼承中只使用一個繼承實體"。
uj5u.com熱心網友回復:
這就是經典的 "鉆石問題"(這里描述的)。你對virtual關鍵字的理解是正確的,但它只適用于你對B1和B2都使用它。
uj5u.com熱心網友回復:
像這樣寫你的代碼:
#include <iostream>
class B
{
public:
B(){std::cout << "B" << std::endl;}.
};
class B1:public B
{
public:
B1(){std::cout << "B1" << std::endl;}.
};
class B2:public B1
{
public:
B2(){std::cout << "B2" << std::endl;}.
};
class D:public B2
{
public:
D(){std::cout << "D" << std::endl;}.
};
int main()
{
D d1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/320063.html
標籤:
