0

我有一个抽象图(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;
    }
};

但是我收到一个无法覆盖基本功能的错误functionB实现这一点的正确方法是什么?

error: 'void B::function(B::InnerB)' marked 'override', but does not override
     void function(InnerB b) override {
      ^~~~~~~~
4

1 回答 1

1

参数类型不同,因此这不是有效的覆盖。

考虑这个函数:

void func(A* a) {
    A::InnerA innerA;
    a->function(innerA);
}

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

于 2021-04-20T09:18:00.373 回答