簡體   English   中英

c ++多重繼承

[英]c++ multiple inheritance

我無法弄清楚在以下場景中會發生什么:

class MBase {
    public:
       MBase(int) {}
       virtual char* vf() const = 0;
       virtual ~MBase() {}
};

class D1 : public MBase { //NOT VIRTUAL!!!
   public:
   D1() : MBase(1) {}
   char* vf() const { return "D1"; }
};

class D2 : virtual public MBase {
    public:
        D2() : MBase(2) {}
        char* vf() const { return "D2"; }
};

class Bottom : public D1, public D2 {
  public:
    char* vf() const { return "Bottom"; }
}

Base* b = new Bottom();  

在鑽石的原始定義中,D1和D2幾乎都是從MBase繼承的,但這里只有一個。 我們在Bottom對象中是否還有兩個獨立的子對象,因此,最后一行不會編譯,因為編譯器不知道要使用哪個子對象?

這在C ++ 03標准的10.1.4節中規定。 虛擬和非虛擬基礎是獨立的,因此每個基礎中都有一個。

通過擴展您的示例很容易看到這一點:

class MBase {
    public:
       MBase(int arg) { cerr << "MBase::MBase(" << arg << ")\n"; }
       virtual const char* vf() const = 0;
       virtual ~MBase() {}
};

class D1 : public MBase { //NOT VIRTUAL!!!
   public:
   D1() : MBase(1) {}
   const char* vf() const { return "D1"; }
};

class D2 : virtual public MBase {
    public:
        D2() 
        : MBase(2) // This doesn't get used in this example because
                   // it is the responsibility of the most-derived
                   // class to initialize a virtual base, and D2 isn't
                   // the most-derived class in this example.
        {
        }
        const char* vf() const { return "D2"; }
};

class Bottom : public D1, public D2 {
  public:
    Bottom() 
    : MBase(5) // D1 and D2 default constructors are called implicitly.
    { 
    }
    const char* vf() const { return "Bottom"; }
};

int main(int argc,char **argv)
{
  Bottom b;
  return 0;
}

輸出:

MBase::MBase(5)
MBase::MBase(1)

我認為你的問題類似於這個......基本上,每個objet都有自己的mBase類基礎對象......

鑽石繼承

此致,Erwald

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM