c++基本語法:虛繼續。本站提示廣大學習愛好者:(c++基本語法:虛繼續)文章只能為提供參考,不一定能成為您想要的結果。以下是c++基本語法:虛繼續正文
虛繼續 的概念的提出重要是為懂得決C++多繼續的成績,舉個最簡略的例子:
class animal{
public :
void op()
{cout << "hello animal" ;}
};
class tiger : public animal {
public :
void tg()
{cout << "this is tiger" ;}
};
class lion : public animal {
public :
void lo()
{cout << "this is lion" ;}
};
class liger : public tiger, public lion {
public :
void lo()
{cout << "this is lion" ;}
};
int main()
{
class liger oneliger ;
liger.op() ;
}
下面的 liger.op() ;會報錯,會提醒隱約的成員變量,由於tiger和lion中都包括父類animal的op()操作。
此時內存中的oneliger對象結構從低到高是上面如許的:
1、animal的成員變量
2、繼續tiger的成員變量
//包含 op()
3、繼續lion的成員變量
/ /也包含op()
4、liger自己的成員變量
PS: 對象在內存中的結構起首是假如有虛函數的話就是虛表,虛表就是指向一個函數指針數組的指針,然後就是成員變量,假如是通俗繼續則起首是最根父類的成員變量,然後是次父類成員變量,順次而來最初是自己的成員變量[虛繼續相反],成員函數被編譯玉成局函數不存儲在對象空間內,須要挪用成員函數的時刻,經由過程類名找到響應的函數,然後將對象的this指針傳給函數:
好比如許的代碼
CTest test;
test.print();
編譯器在外部將轉換為:(偽代碼)
CTest test;
CTest_print( &test ); // CTest的print函數轉換為:CTest_print( CTest* const this);
所以這就和通俗函數挪用差異不年夜了
現實應當是函數找到對象,即依據this指針
為懂得決 下面多繼續的成績,所以c++中提出了虛繼續的概念,虛繼續就是在子類中只保存一份父類的拷貝,拿下面的類子來講,就是“假如有一份父類的拷貝的話就用父類的拷貝,假如沒有就參加一份拷貝” :
class animal{
public :
void op()
{cout << "hello animal" ;}
};
class tiger : public virtual animal {
public :
void tg()
{cout << "this is tiger" ;}
};
class lion : public virtual animal {
public :
void lo()
{cout << "this is lion" ;}
};
class liger : public tiger, public lion {
public :
void lo()
{cout << "this is lion" ;}
};
int main()
{
class liger oneliger ;
liger.op() ;
}
此時liger對象在內存中的結構就釀成了:
4、animal的成員變量
3、繼續tiger的成員變量
//包含 op()
2、繼續lion的成員變量
//曾經包括一份拷貝,所以 曾經不包含op()
1、liger自己的成員變量
如許內存中就只要一份animal對象的拷貝,所以就不會存在隱約的成績;