簡體   English   中英

為什么虛擬繼承在這種情況下不起作用?

[英]Why virtual inheritance doesn't work in this case?

我有下面顯示的代碼。 XBaseXBarX庫的類,因此無法更改它們。

#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)為什么編譯器無法找出BaseXBar具有相同的父對象,讓我在這里使用虛擬繼承?

2)例如,如果BC具有共同的祖先A ,但是它們具有不同的基類,則可以使用虛擬繼承嗎?
就像鑽石,但是CA之間還有另一類。

UPD:第二個問題與-為什么BC必須明確地是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;
  }
};
// --

我認為問題在於XBarBase不使用XBase虛擬繼承。 如果他們做到了,我認為這會起作用。 但是XBarBase定義了自己的XBase

暫無
暫無

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

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