c++ - 在派生中使用额外的默认参数重载基类方法

标签 c++ inheritance overloading 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); }
};

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

最佳答案

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

您的第一次尝试没有成功,因为您正在定义一个带有一个参数的方法,而您试图覆盖的虚拟方法为零。为参数提供默认值不会更改函数采用的参数数量,因此它不匹配无参数重载以覆盖它。它所做的只是指示编译器在任何省略它的调用点插入默认值,在这种情况下,这种调用在无参数版本和带有参数默认值的单参数版本之间是不明确的。

关于c++ - 在派生中使用额外的默认参数重载基类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26281592/

相关文章:

c++ - 我应该避免从 std::iostream 继承吗?

java - 如何在不编写重复代码的情况下处理继承链中的默认值?

c++ - 自定义字符串类 (C++)

c# - : this() As a constructor

language-agnostic - 使用大量参数的缺点

c++ - 在 C++ 中使用 ASM

c++ - 转到优化重构

javascript - TypeError : Super expression must be null or a function, 未使用 Babeljs 定义

c++ - boost multi_index : retrieve unique values of a non-unique key

c++ - 如何使用boost asio