在另一个(来自抽象父级)父级中定义抽象方法?
Define abstract method in another (from abstract parent) parent?
我希望在我的代码中 C++ 会注意到在 class D 中来自 class 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;
}
class D
显然是抽象的,因为它没有提供 C
中定义的 secret
的实现。类型 D
读起来不明确,因为不清楚它的成员 secret
是否会继承自 C
或 A
。
您的层次结构如下:
A
有一个名为 secret
的虚成员函数。而 C
有一个 完全不相关的 纯虚成员函数,名为 secret
。由于 D
不提供覆盖 C::secret
,因此 D
也被视为抽象 class。 A::secret
存在并不重要 - A
不继承自 C
并且只有基础 classes 可以提供虚拟覆盖。
如果您想使用 A::secret
覆盖 C::secret
,您必须明确地这样做:
class D: public B, public C {
void secret() override {
A::secret();
}
};
我希望在我的代码中 C++ 会注意到在 class D 中来自 class 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;
}
class D
显然是抽象的,因为它没有提供 C
中定义的 secret
的实现。类型 D
读起来不明确,因为不清楚它的成员 secret
是否会继承自 C
或 A
。
您的层次结构如下:
A
有一个名为 secret
的虚成员函数。而 C
有一个 完全不相关的 纯虚成员函数,名为 secret
。由于 D
不提供覆盖 C::secret
,因此 D
也被视为抽象 class。 A::secret
存在并不重要 - A
不继承自 C
并且只有基础 classes 可以提供虚拟覆盖。
如果您想使用 A::secret
覆盖 C::secret
,您必须明确地这样做:
class D: public B, public C {
void secret() override {
A::secret();
}
};