我對VIRTUAL關鍵詞感到困惑。我試圖找出編譯器如何在內存中實現這一點。 好吧,讓我解釋一下例子。我正在使用Microsoft Visual Studio 2010作爲虛擬依賴編譯器的實現。C++編譯器如何在內存中實現虛擬繼承?
這裏是第一代碼
#include<iostream>
class one
{
int _a;
public:
virtual ~one(){}
};
class two:public one
{
int _a;
public:
virtual ~two(){}
};
int main()
{
using namespace std;
cout<<"sizeof two="<<sizeof(two)<<endl;
return 0;
}
O/P是因爲_ 的vptr _TWO,一個:: _和兩個:: _一個
這裏12個字節,是另一個示例代碼
#include<iostream>
class one
{
int _a;
public:
virtual ~one(){}
};
class two
{
int _a;
public:
virtual ~two(){}
};
class three:virtual public one,virtual public two
{
};
int main()
{
using namespace std;
cout<<"sizeof three="<<sizeof(three)<<endl;
return 0;
}
在這種情況下o/p是20字節:O怎麼回事?請解釋!!據我說,它應該是16個字節。 __vptr_three(指向vtable的指針),_vptr1_three(指向虛擬基類表的指針),one :: _ a和two :: _ a。爲什麼要維護虛擬基類表?
注意:你的虛擬基類的例子是......很奇怪。理論上,虛擬繼承用於解決*鑽石問題*:D從C和B繼承,C和B都從A繼承。您沒有鑽石,因此虛擬繼承在您的情況下無用。 –
@MatthieuM。你的觀點是相關的馬特,但我不想實施任何我只是學習:),當你學習你應該學習所有方面! –