我使用多重继承来提供两个共享类似方法的不同接口。 MWE代码如下:
struct A {
virtual void foo() = 0;
};
struct B {
virtual void foo() = 0;
};
struct C : public A {
virtual void foo() override { }
};
struct D : public B, public C {
};
int main(void) {
D x;
return 0;
}
但是在使用g++
编译时会产生以下错误:
main.cpp: In function ‘int main()’:
main.cpp:17:4: error: cannot declare variable ‘x’ to be of abstract type ‘D’
D x;
^
main.cpp:13:8: note: because the following virtual functions are pure within ‘D’:
struct D : public B, public C {
^
main.cpp:6:15: note: virtual void B::foo()
virtual void foo() = 0;
^~~
我试图避免使用菱形图案(我只想提供两个共同使用某些方法的接口),我宁愿不必在foo()
中重新实现struct D
,即使它是只是致电C::foo()
。
有什么方法吗?
答案 0 :(得分:0)
你必须在某个时候实际实现B :: foo,即使它只是转发给其他函数,也无法解决这个问题。 B :: foo与A :: foo没有任何关系,它们与编译器完全不同。
如果B :: foo()确实应该是A :: foo(),那么B似乎应该从A派生,而B根本不应该有foo。