微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决重载派生类中的虚拟方法,以便在 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 实现(和任何其他派生类)中使用此参数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。