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