带有内部类参数的 C++ 覆盖函数

问题描述

我有一个抽象图(示例中为 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);
}

对于有效的覆盖,这必须是对派生类函数的有效调用,但事实并非如此。通过具有相同的参数和返回类型,派生类函数必须能够处理所有对基类函数的调用。