我知道有很多關於MI的問題,但是,似乎沒有人回答我的問題。我有以下最小的例子:多虛擬繼承
#include <iostream>
struct Base{
virtual void foo() = 0;
};
struct A : public virtual Base{
void foo(){
std::cout << "A::foo()" << std::endl;
}
void foo(int a){
std::cout << "A::foo(int a)" << std::endl;
}
};
struct B : public virtual Base{
virtual void foo(int a) = 0;
};
struct C : public B,public A{
using A::foo;
};
int main(int argc, char* argv[]){
C c;
c.foo();
c.foo(1);
}
其中基地,和B是完全虛擬類和甲提供所有的實施。但是,代碼不編譯,而是給了我以下錯誤消息
mh.cpp: In function ‘int main(int, char**)’:
mh.cpp:22:11: error: cannot declare variable ‘c’ to be of abstract type ‘C’
C c;
^
mh.cpp:17:12: note: because the following virtual functions are pure within ‘C’:
struct C : public B,public A{
^
mh.cpp:15:22: note: virtual void B::foo(int)
virtual void foo(int a) = 0;
我希望可以通過擴展C
類來實現
struct C : public B,public A{
using A::foo;
void foo(int a){
A::foo(a);
}
};
但是該行爲,我寧願不添加此多餘的方法。有什麼辦法可以達到這個結果嗎?
你可以添加'虛擬無效美孚(INT A)= 0;''到Base'? – songyuanyao
我推薦在任何你認爲你重寫虛擬函數的地方使用C++ 11中新提供的'override'說明符。它使這樣的問題更容易找到。 –
非常感謝。我認爲我可以像使用Java中的接口一樣使用虛擬類。我意識到我不能,並會相應地更新我的設計。 – user823255