[英]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
,它具有類A
和B
作為基類:
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::foo
與A::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.