使用C ++中的父类实现覆盖纯虚方法

时间:2017-12-19 16:29:29

标签: c++ multiple-inheritance virtual-method

我使用多重继承来提供两个共享类似方法的不同接口。 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()

有什么方法吗?

1 个答案:

答案 0 :(得分:0)

你必须在某个时候实际实现B :: foo,即使它只是转发给其他函数,也无法解决这个问题。 B :: foo与A :: foo没有任何关系,它们与编译器完全不同。

如果B :: foo()确实应该是A :: foo(),那么B似乎应该从A派生,而B根本不应该有foo。