关于c++中虚函数重载的问题

#include<iostream>
using namespace std;

class base
{
public:
virtual void func()
{
cout<<"reach base::func()\n"<<endl;
}

virtual void func(int a)
{
cout<<"reach base::func("<<a<<")"<<endl;
}
};
class derive:public base
{
public:
virtual void func()
{
cout<<"reach derived::func()"<<endl;

}

};

int main()
{
derive d;
d.func(1);

return 0;
}

我个人理解既然公共继承了,那就能调用基类中的函数哈,为什么d.func(1);
编译通不过呢?

大家都说错了,没说到重点。
这不是什么虚函数限制,主要原因在于函数调用名称解释的问题。按照名称解析规则,func在类derive中已经找到,所以后续的按参数匹配的名称查找会在该类中进行。
这也可以说是一个C++的值得商讨的地方吧,不过更多的,这可以做一个好的特性来使用,因为它避免了一些有争议的名称解析。
你可以这样指明调用关系:d.base::func(1);

derive类中的func关没有覆盖基类的虚函数。
思考如下的函数关系,你就会明白我说的争议的名称解析是什么意思了。如果名称查找继续发生在基类,后面的函数会引发二义性。
class base

{
public:
virtual void func(long a)
{
cout<<"reach base::func("<<a<<")"<<endl;
}

void func(double c)
{
cout<<"reach base::func("<<c<<")"<<endl;
}
};
class derive:public base
{
public:
virtual void func(long a)
{
cout<<"reach derive::func("<<a<<")"<<endl;
}
};

void main()
{
derive d;
d.func(1);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-24
在派生类重新定义或者覆写基类的重载函数,会导致继承的名称被遮掩。

在派生类的 public 区域增加 using base::func; 语句可以解决。

参考资料:《Effective C++》条款 33

第2个回答  2012-10-24
你在derive类中的func也加上了virtual导致基类函数被覆盖,所以肯定错了
第3个回答  2012-10-24
虚函数的问题!!
第4个回答  2012-10-24
虚函数的限制
如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现这种同名函数。

参考资料:http://baike.baidu.com/view/161302.htm

本回答被网友采纳
相似回答