1
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); };
};                                      // ^^^^^^^^^^^^^^^^^^^^

前面的代码无法编译:error C2660: 'Derived::myFunc' : function does not take 2 arguments 显然编译器看不到我正在尝试调用基类中定义的函数或任何覆盖它的函数。另一方面,以下代码编译正常:

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); };
};

我认为我在第一个示例中尝试做的是合法的 C++,那么这是 VS2010 编译器中的错误吗?我与 VS2008 有相同的结果

谢谢

编辑:我发现的一种解决方法是使用

virtual void myFunc(double a) { return ((Base*)this)->myFunc(a, 0.0); };

但我不是 100% 确定它具有完全相同的效果,有人可以确认吗?

4

2 回答 2

7

此行为是设计使然。

派生类中的函数隐藏基类中的其他重载

于 2012-05-09T20:09:12.867 回答
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调用重新绑定到其他重载并调用其他内容。

于 2012-05-10T05:20:40.000 回答