大家都说错了,没说到重点。
这不是什么虚函数限制,主要原因在于函数调用名称解释的问题。按照名称解析规则,func在类derive中已经找到,所以后续的按参数匹配的名称查找会在该类中进行。
这也可以说是一个C++的值得商讨的地方吧,不过更多的,这可以做一个好的特性来使用,因为它避免了一些有争议的名称解析。
你可以这样指明调用关系:d.base::func(1);
derive类中的func关没有覆盖基类的虚函数。
思考如下的函数关系,你就会明白我说的争议的名称解析是什么意思了。如果名称查找继续发生在基类,后面的函数会引发二义性。
class base
{
public:
virtual void func(long a)
{
cout<<"reach base::func("< }
void func(double c)
{
cout<<"reach base::func("<
};
class derive:public base
{
public:
virtual void func(long a)
{
cout<<"reach derive::func("< }
};
void main()
{
derive d;
d.func(1);
}
在派生类重新定义或者覆写基类的重载函数,会导致继承的名称被遮掩。
在派生类的 public 区域增加 using base::func; 语句可以解决。
你在derive类中的func也加上了virtual导致基类函数被覆盖,所以肯定错了
虚函数的问题!!
虚函数的限制
如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现这种同名函数。