在另一个(来自抽象父)父类中定义抽象方法?

时间:2015-08-26 15:56:06

标签: c++ inheritance abstract

我希望在我的代码中,C ++会注意到在D类中,C语言中的抽象方法已经在A中定义了。但事实并非如此。类似的代码可以在Java中工作(其中C就像接口一样)。目前它输出失败:

error: cannot declare variable ‘x’ to be of abstract type ‘D’
note:   because the following virtual functions are pure within ‘D’:
note:   virtual void C::secret()

使它运作的最佳方法是什么?

#include <iostream>

class A {
  public:
    virtual void secret() {
      std::cout<<"secret a func\n";
    };
};

class B: public A {};

class C {
  public:
    virtual void secret() = 0;
};

class D: public B, public C {};

int main() {
  D x;
  return 0;
}

2 个答案:

答案 0 :(得分:4)

您的层次结构如下:

enter image description here

A有一个名为secret的虚拟成员函数。 C有一个名为secret完全不相关的纯虚拟成员函数。由于D没有提供覆盖C::secret,因此D也被视为抽象类。 A::secret存在并不重要 - A不从C继承,只有基类可以提供虚拟覆盖。

如果您想使用A::secret来覆盖C::secret,则必须明确地这样做:

class D: public B, public C {
    void secret() override {
        A::secret();
    }
};

答案 1 :(得分:1)

D显然是抽象的,因为它没有提供secret中定义的C的实现。类型D的含义不明确,因为不清楚其成员secret是继承自C还是A

相关问题