在派生 class 中重载虚方法,因此它在 C++ 中需要更多参数

Overload a virtual method in a derived class so it takes more parameters in C++

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

然后我有几个class继承自A,它们都定义了方法foo。但我需要其中之一,B,这样 foo 需要一个额外的参数,int b,有点过载。

那我想这样做:

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

但是我收到一条错误消息,告诉我 foo 使用了太多参数。

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

只有当要使用​​的指针是B类型时,才可以使用B的重载函数。

参见:

#include <iostream>
#include <memory>

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

class B : public A
{
public:
    virtual void foo(int a) override
    {

    }
    void foo(int a, int b)
    {
        std::cout << a << "," << b;
    }
};

int main(){
    auto b = std::make_shared<B>();
    b->foo(1, 2);
    
    //to use a:
    A* aPtr = b.get();
    aPtr->foo(1);

    return 0;
}

虽然 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 之间有不同的接口,我建议以新基础 class 的形式添加一个抽象层(我将其称为 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 实现(以及任何其他派生的 类)中使用此参数。