我有一个类A
,它有一个方法f
,而这个方法是重载的。
class A {
public:
void f(int argument);
void f(double arg1, double arg2);
void f(char* argument1, int argument2, int argument3);
};
然后我有一个类B
,它继承自A
。我想为f
函数的所有选项添加一个新的参数。除了手动操作,还有其他方法吗?我的意思是,我认为这会奏效:
class B : public A {
public:
void f(int argument, int addedArgument);
void f(double arg1, double arg2, int addedArgument);
void f(char* argument1, int argument2, int argument3, int addedArgument);
};
但我的问题是,是否有更好的方法可以做到这一点。谢谢。:(
B
中的函数将是全新的重载A
中可用的函数。
它们将隐藏A
中的函数,因此如果您有B
对象,则无法从A
:调用函数
B b;
b.f(1, 2); // void B::f(int argument, int addedArgument)
b.f(1); // Error, can't find void A::f(int argument)
如果您想同时调用B
中的新重载和A
中的旧重载,则需要使用using
关键字将A
中的函数添加到B
的范围中:
class B : public A {
public:
using A::f; // Add the A::f function overloads to B
void f(int argument, int addedArgument);
void f(double arg1, double arg2, int addedArgument);
void f(char* argument1, int argument2, int argument3, int addedArgument);
};
现在,您可以同时使用A
和B
中的两组函数。
还要注意,B
中的函数是重载,它们不会覆盖A
中的函数。
至于是否存在";"更好";那么答案是否定的;添加";参数到函数,而不重载,这意味着您对基本上相同的函数有两个定义。
话虽如此,如果这两个重载有许多共同的部分,您可以将它们分解为两个重载都可以调用的单独函数。
简单来说,这也是不可能的,如果这是可能的,那么使用虚拟方法就没有任何意义。
在您的代码中,您不是在重写方法,而是在创建新的重载方法。