重载派生类中的虚拟方法,以便在 C++ 中使用更多参数

问题描述

我有一个抽象类 A 和纯虚方法 void foo(int a) = 0

然后我有几个继承自 A 的类,它们都定义了方法 foo。但我需要其中一个 B 来使 foo 接受一个额外的参数 int b,所以有点重载。

那么我想这样做:

A *bInstance = new B();
bInstance -> foo(1,2);

但是我收到一个错误,告诉我 foo 使用的参数太多。

写这篇文章,我意识到这样做有点奇怪,所以也许你不能这样做,但你不能这样做也很好。但如果有可能,请告诉我应该怎么做。

解决方法

仅当要使用的指针为 B 类型时,才能使用 B 的重载函数。

见:

if(Array.isArray(val)) {
  console.log("NOT EMPTY");
} else {
  console.log("EMPTY");
}
,

尽管 Bernd 的回答是一种可能性,但您必须问问自己过载的影响是什么。例如,考虑以下内容。

std::unique_ptr<A> bAsA = std::make_unique<B>();
bAsA->foo(1,2); // no worky.
bAsA->foo(1); // works,but what should it do?

AB 之间存在不同的接口,我建议以新基类(我将其称为 C)的形式添加一个抽象层。

所以代替

struct A {
    // common
    virtual void bar() {}
    // class specific
    virtual void foo(int) = 0;
};

struct B: public A {
    // weird unused override which is still available
    void foo(int) override {}
    // class specific
    void foo(int,int) {}
};

使用

struct C {
    // common
    virtual void bar() {}
};

struct A: public C {
    // class specific
    virtual void foo(int) = 0;
};

struct B: public C {
    // class specific
    void foo(int,int) {}
};
,

您可以使用默认参数完全实现您想要的:

class A
{
    public:
    virtual void foo(int a,int b = 0) = 0;
    virtual ~A() = default;
};

class B : public A
{
    public:
    void foo(int a,int b) override { }
};

class C : public A
{
    public:
    void foo(int a,int b = 0) override { }
};

int main()
{
    A* b = new B();
    A* c = new C();

    b->foo(1,2);
    c->foo(1);
}

如果您不需要,您不必在 C::foo 实现(和任何其他派生类)中使用此参数。