使用Derived中的额外默认参数重载Base类方法

时间:2014-10-09 14:54:08

标签: c++ inheritance overloading method-overriding

我的基类提供了一个没有参数的虚方法,如下所示:

class Base{
   virtual void myMethod(void) = 0;
};

我想在Derived类中覆盖并提供一个实现(Derived类不应该是抽象类型),另外通过设置提供可选参数默认值,如下:

class Derived : public Base{
   void myMethod(Thing *optional = NULL) { ... }
};

但我似乎得到了类型的错误:

error: cannot allocate an object of abstract type 'Derived'
   because the following virtual functions are pure within 'Derived':
   virtual void myMethod()

现在,我知道当重载函数时,following functions can not exist along each other

void myFunction();
void myFunction(Thing *optional = NULL);

因为函数调用myFunction()将匹配两个声明的函数。遵循这个逻辑,我在Derived中的定义应该覆盖没有参数的Base方法,并且"添加另一种方法"有一个论点,但它没有

我知道我可以通过以下定义来解决这个问题:

class Derived : public Base{
    void myMethod(Thing *optional) { ... }
    void myMethod() { myMethod(NULL); }
};

我的问题是:这真的是实现所需功能的唯一途径吗?如果是这样,为什么我试图不被允许而且没有像我期望的那样编译?

1 个答案:

答案 0 :(得分:3)

是的,您建议的最后一个代码块是解决此问题的正确方法。

您的第一次尝试不起作用,因为您正在使用一个参数定义方法,并且您尝试覆盖的虚拟方法为零。赋予参数默认值不会更改函数所使用的参数数量,因此它与no-arg重载不匹配以覆盖它。它所做的只是指示编译器在任何省略它的调用站点插入默认值,在这种情况下,这样的调用在no-arg版本和one-arg版本之间将是不明确的,并带有参数的默认值。