如何向继承的重载函数添加新参数



我有一个类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);
};

现在,您可以同时使用AB中的两组函数。

还要注意,B中的函数是重载,它们不会覆盖A中的函数


至于是否存在";"更好";那么答案是否定的;添加";参数到函数,而不重载,这意味着您对基本上相同的函数有两个定义。

话虽如此,如果这两个重载有许多共同的部分,您可以将它们分解为两个重载都可以调用的单独函数。

简单来说,这也是不可能的,如果这是可能的,那么使用虚拟方法就没有任何意义。

在您的代码中,您不是在重写方法,而是在创建新的重载方法。

最新更新