C++ 在派生类中重载具有额外默认参数的基类方法

C++ 在派生类中重载具有额外默认参数的基类方法,c++,inheritance,overloading,overriding,C++,Inheritance,Overloading,Overriding,我的基类提供了一个没有参数的虚拟方法,如下所示: class Base{ virtual void myMethod(void) = 0; }; class Derived : public Base{ void myMethod(Thing *optional) { ... } void myMethod() { myMethod(NULL); } }; 我想在派生类中重写它,并提供一个实现(派生类不应该是抽象类型),另外通过设置默认值提供一个可选参数,如下所示: c

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

class Base{
   virtual void myMethod(void) = 0;
};
class Derived : public Base{
    void myMethod(Thing *optional) { ... }
    void myMethod() { myMethod(NULL); }
};
我想在派生类中重写它,并提供一个实现(派生类不应该是抽象类型),另外通过设置默认值提供一个可选参数,如下所示:

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()
现在,我知道重载函数时:

因为函数调用
myFunction()
将匹配两个声明的函数。按照此逻辑,
Derived
中的我的定义应该覆盖不带参数的
Base
方法,并用一个参数“添加另一个方法”,但它不

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

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

我的问题是:这真的是实现所需功能的唯一方法吗?如果是这样的话,为什么我正在尝试的内容不被允许,也没有像我预期的那样被编译?

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

您的第一次尝试不起作用,因为您使用一个参数定义了一个方法,而您尝试重写的虚拟方法没有参数。为参数指定默认值不会更改函数接受的参数数量,因此它不匹配no arg重载以覆盖它。它所做的只是指示编译器在忽略默认值的任何调用站点插入默认值,在这种情况下,这种调用在无参数版本和参数具有默认值的单参数版本之间是不明确的