[英]Why virtual inheritance doesn't work in this case?
我有下面顯示的代碼。 XBase
和XBar
是X
庫的類,因此無法更改它們。
#include <iostream>
using namespace std;
// -- library stuff -- I can't change this
struct XBase {
virtual void foo() = 0;
};
struct XBar : public XBase {
virtual void foo() {
cout << "XBar::foo()" << endl;
}
};
// --
// -- my stuff --
struct Base : public XBase {
virtual void foo() {
cout << "Base::foo()" << endl;
}
};
struct Bar : public virtual Base, public virtual XBar { // <-- that's ok, but doesn't let use XBase pointer to Bar instance
virtual void foo() {
cout << "Bar::foo()" << endl;
}
};
// --
int main() {
Bar bar;
bar.foo();
static_cast<Base*>(&bar)->foo();
static_cast<XBar*>(&bar)->foo();
static_cast<XBase*>(&bar)->foo();
return 0;
}
由於Bar
定義無效,因此未編譯代碼。
1)為什么編譯器無法找出Base
和XBar
具有相同的父對象,讓我在這里使用虛擬繼承?
2)例如,如果B
和C
具有共同的祖先A
,但是它們具有不同的基類,則可以使用虛擬繼承嗎?
就像鑽石,但是C
和A
之間還有另一類。
UPD:第二個問題與-為什么B
和C
必須明確地是A
派生詞?
避免多重繼承會更好,而且,我想這將是一種解決方法,但問題仍然存在。
修改您的代碼為此:
// -- library stuff --
struct XBase {
virtual void foo() = 0;
};
struct XBar : public XBase {
virtual void foo() {
cout << "XBar::foo()" << endl;
}
};
// --
// -- my stuff --
struct Base : public virtual XBar {
virtual void foo() {
cout << "Base::foo()" << endl;
}
};
struct Bar : public Base {
virtual void foo() {
cout << "Bar::foo()" << endl;
}
};
// --
我認為問題在於XBar
和Base
不使用XBase
虛擬繼承。 如果他們做到了,我認為這會起作用。 但是XBar
和Base
定義了自己的XBase
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.