问题描述
我有一个抽象图(示例中为 A
)。它具有用于其中一个函数的内部类 InnerA
。我想从这个类派生一个新类(例如 B
)并在 InnerA
周围做一个包装器来添加一个应该在 B
中使用的新字段。
class A {
public:
class InnerA {};
virtual void function(InnerA) = 0;
};
class B : public A {
public:
class InnerB : InnerA {
public:
int new_field = 0;
};
void function(InnerB b) override {
b.new_field = 1;
}
};
但我收到一个错误,指出 function
中的 B
无法覆盖基本函数。实现此目的的正确方法是什么?
error: 'void B::function(B::InnerB)' marked 'override',but does not override
void function(InnerB b) override {
^~~~~~~~
解决方法
参数类型不同,因此这不是有效的覆盖。
考虑这个函数:
void func(A* a) {
A::InnerA innerA;
a->function(innerA);
}
对于有效的覆盖,这必须是对派生类函数的有效调用,但事实并非如此。通过具有相同的参数和返回类型,派生类函数必须能够处理所有对基类函数的调用。