我的基类提供了一个没有参数的虚方法,如下所示:
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); }
};
我的问题是:这真的是实现所需功能的唯一途径吗?如果是这样,为什么我试图不被允许而且没有像我期望的那样编译?
答案 0 :(得分:3)
是的,您建议的最后一个代码块是解决此问题的正确方法。
您的第一次尝试不起作用,因为您正在使用一个参数定义方法,并且您尝试覆盖的虚拟方法为零。赋予参数默认值不会更改函数所使用的参数数量,因此它与no-arg重载不匹配以覆盖它。它所做的只是指示编译器在任何省略它的调用站点插入默认值,在这种情况下,这样的调用在no-arg版本和one-arg版本之间将是不明确的,并带有参数的默认值。