如何解决重载派生类中的虚拟方法,以便在 C++ 中使用更多参数
我有一个抽象类 A
和纯虚方法 void foo(int a) = 0
然后我有几个继承自 A
的类,它们都定义了方法 foo
。但我需要其中一个 B
来使 foo
接受一个额外的参数 int b
,所以有点重载。
那么我想这样做:
A *bInstance = new B();
bInstance -> foo(1,2);
写这篇文章,我意识到这样做有点奇怪,所以也许你不能这样做,但你不能这样做也很好。但如果有可能,请告诉我应该怎么做。
解决方法
仅当要使用的指针为 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?
A
和 B
之间存在不同的接口,我建议以新基类(我将其称为 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 举报,一经查实,本站将立刻删除。