簡體   English   中英

實現具有多重繼承的純虛函數

[英]Implementing pure virtual functions with multiple inheritance

假設有此接口:

class A{  
 public:  
  virtual foo()=0;  
};

和一個實現此接口的類B

class B:public A{    
 public:   
  virtual foo(){} //Foo implemented by B   
}

最后,一個類C ,它具有類AB作為基類:

Class C : public A, public B {
};

我的問題是,有一種方法可以告訴編譯器foo的實現是來自類B的實現,而無需對B::foo()進行顯式調用?

正如@BenVoigt在評論中指出的那樣,以下答案僅是由於g ++中的一個錯誤而有效(這意味着它不能保證繼續工作,並且絕對不能移植)。 因此,盡管使用特定的(編譯器)編譯器可以滿足您的要求,但這不是您應該使用的選項。

不過要使用虛擬繼承


這不完全是問題中的代碼所暗示的情況,而是句子

我的問題是,有一種方法可以告訴編譯器foo的實現是來自類B的實現,而無需對B :: foo()進行顯式調用?

似乎要求語法來區分一個函數的多個基本版本,而不使用::限定符。

您可以using指令執行此using

#include <iostream>
class A {
public:
A(){}
virtual void foo(){std::cout<<"A func";}
};

class B: virtual public A {
  public:
  B(){}
  virtual void foo(){std::cout<<"B func";}
};
class C:virtual public A, virtual public B {
    public:
    C(){}
    using A::foo; // tells the compiler which version to use
                   // could also say using B::foo, though this is unnecessary
};

int main() {
    C c;
    c.foo(); // prints "A func"
    return 0;
}

當然,正如其他答案所指出的那樣,問題中的代碼本身根本不需要這樣做。

只需使用虛擬繼承,即可使B提供的A子對象與C使用的對象相同。

或編寫class C : public B ...仍然可以通過基類B隱式地用作A


在編輯問題之前:

B::fooA::foo不兼容。

所需的簽名是

ReturnType /* missing from question */ foo(A* const this /* this parameter is implicit */);

但是B::foo有簽名

ReturnType foo(B* const this);

一個A* ,這將被傳遞到虛函數,是不是一個B* ,其實現需要。 如果B繼承自A ,則編譯器將生成B::foo以接受A* const subobject並從該子對象指針中找到B* const this對象的B* const this 但是B::foo不了解C中的關系。

由於示例中有兩個基類(可能是設計問題/設計異味,我會回顧一下),因此必須顯式調用要執行的實現,無論是A::foo()還是B:foo()

如果B只是提供foo()的實現,我會考慮將實現移到A中(您可以為純虛函數提供實現),但是即使在這種情況下,也必須通過其限定名稱來調用它。

暫無
暫無

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

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