2012-05-09 175 views
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 显然编译器不能看到,我想调用基类中定义的函数,或重写它的任何功能。在另一方面,下面的代码编译确定:这是Visual 2010的编译错误吗?

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%肯定它具有完全相同的效果,任何人都可以确认?

+1

提示:这不是一个错误。 –

+3

尝试添加一个'使用Base :: myFunc'到你的类'Derived'的开头。 –

+0

[为什么派生类中的重写函数隐藏了基类的其他重载?](http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the- derived-class-hide-other-overloads-of-the) – Tony

回答

7

此行为是设计使然。

派生类中的函数hide other overloads in the base class

+0

所以这不会编译其他任何东西?我不确定我是否看到这个限制点 – lezebulon

+0

@lezebulon:正确。我不确定为什么这是真的。 – SLaks

+0

http://stackoverflow.com/q/1628768/34397 – SLaks

0

这不是一个错误。

您在C选择++继承的重载是否应该被隐藏(这是更安全,默认行为)或可用:

class Derived : public Base { 
public: 
    virtual void myFunc(double a) { return this->myFunc(a, 0.0); }; 
    using Base::myFunc; 
}; 

另外,也可以在功能点使用Base::myFunc语法呼叫。

在的第17.4.5.3和17.5节中,对名称空间和超载之间的默认行为有一个解释。假设Base是一个库类,而Derived是您的应用程序代码。该库的下一个版本肯定会对许多功能产生新的过载,甚至可能是myFunc,并且你当然不希望你的测试程序沉默地重新绑定它的myFunc调用其他重载并调用其他的东西。