class Base {
public:
virtual void myFunc(double a, double b) { };
virtual void myFunc(double a) { };
};
class Derived : public Base {
public:
virtual void myFunc(double a) { return this->myFunc(a, 0.0); };
}; // ^^^^^^^^^^^^^^^^^^^^
以前的代码无法编译:{{1}} 显然,编译器无法看到我正在尝试调用Base类中定义的函数,或者任何覆盖它的函数。另一方面,以下代码编译好了:
error C2660: 'Derived::myFunc' : function does not take 2 arguments
我认为我在第一个例子中尝试做的是合法的C ++,这是VS2010编译器中的一个错误吗?我对VS2008有相同的结果
感谢
编辑:我找到的解决方法是使用
class Base {
public:
virtual void myFunc2(double a, double b) { };
virtual void myFunc(double a) { };
};
class Derived : public Base {
public:
virtual void myFunc(double a) { return this->myFunc2(a, 0.0); };
};
但我不是100%确定它具有完全相同的效果,有人可以确认吗?
答案 0 :(得分:7)
此行为是设计使然。
答案 1 :(得分:0)
这不是错误。
您可以选择C ++中是否应隐藏继承的重载(这是更安全的默认行为)还是可用的:
class Derived : public Base {
public:
virtual void myFunc(double a) { return this->myFunc(a, 0.0); };
using Base::myFunc;
};
或者,您可以在函数调用时使用Base::myFunc
语法。
在D&E,第17.4.5.3节和第17.5节中,对名称空间和重载之间的交互的默认行为进行了解释。假设Base
是库类,而Derived
是您的应用程序代码。该库的下一个版本肯定会为许多函数带来新的重载,甚至可能是myFunc
,你肯定不希望你经过良好测试的程序静默重新绑定其myFunc
调用其他重载并调用其他函数