我希望在我的代码中,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;
}
答案 0 :(得分:4)
您的层次结构如下:
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
。