真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

七、C++繼承與多態(tài)-多重繼承的那些坑該怎么填

理解虛基類和虛繼承

多重繼承:代碼復用,一個派生類有多個基類。如:class C: public A,public B{};

10年積累的成都網(wǎng)站建設、網(wǎng)站建設經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站設計后付款的網(wǎng)站建設流程,更有豐澤免費網(wǎng)站建設讓你可以放心的選擇與我們合作。

虛基類:virtual可以修飾繼承方式,是虛繼承,被虛繼承的類,稱作虛基類。class A:virtual public B{};

虛繼承的類中會多一個vbptr指向vbtable,Vbtable中保存的是虛基類中數(shù)據(jù)在派生類中的內存偏移量,從虛基類中繼承的成員變量會被放在派生類內存的最下端。

虛函數(shù)和虛基類在調用的時候是沒有問題的,

但是在delete的時候會發(fā)生堆報錯

原因是:基類指針類型的成員p指向派生類對象,永遠指向的是派生類基類部分數(shù)據(jù)的起始地址,這里的基類A的起始位置就是vfptr。但是這里的派生類B是虛繼承的A,虛繼承的部分會放到派生類內存的后面,p指向的就是派生類后面的內存,這種情況Delete p就不會刪除派生類中的內存,造成了上圖中的問題。

class A{
public:
    virtual void func(){cout<<"call A:func"<func();
    delete p;
}

delete的內存地址與new的內存地址不同,所以會造成問題。

菱形繼承問題

繼承的樣子像菱形,叫菱形繼承。類D中會繼承兩個類A中的成員。盡量避開多重繼承。

多重繼承的好處:可以做更多代碼的復用。

用虛繼承解決上面的問題。

class A{
public:
    A(int data):ma(data){
        cout<<"A()"<

如果虛繼承就會在B和C中構造出vbptr指針,在D中指向類A中的成員變量。

使用虛繼承避免繼承多次的問題:

class B:virtual public A{//使用虛繼承避免菱形繼承的問題
public:
    B(int data):A(data),mb(data){
        cout<<"B()"<

C++的四種類型轉換

const_cast:去掉(指針或者引用)常量屬性的一個類型轉換

static_cast:提供編譯器認為安全的類型轉換 基類和派生類可以通過static_cast進行轉換

reinterpret_cast:類似于c風格的強制類型轉換(不安全)

dynamic_cast:主要用在繼承結構中,可以支持RTTI類型識別的上下轉換

解釋一下dynamic_cast的用法:

class Base{
public:
    virtual void func()=0;
};

class Derive1:public Base{
public:
    void func() override {
        cout<<"Derive1::func()"< (p);
    if(dp2!= nullptr){
        dp2->funcDerive2();
    }else
        p->func();
}

int main(){
    Derive1 d1;
    Derive2 d2;
    show(&d1);
    show(&d2);

    return 0;
}

/*
輸出結果:
Derive1::func()
Derive2::funcDerive2()*/


網(wǎng)站名稱:七、C++繼承與多態(tài)-多重繼承的那些坑該怎么填
分享鏈接:http://weahome.cn/article/dsoipeo.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部