在派生 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?
如果 A
和 B
之间有不同的接口,我建议以新基础 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
实现(以及任何其他派生的 类)中使用此参数。
我有一个抽象 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?
如果 A
和 B
之间有不同的接口,我建议以新基础 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
实现(以及任何其他派生的 类)中使用此参数。