永发信息网

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

答案:5  悬赏:0  手机版
解决时间 2021-01-03 20:19
  • 提问者网友:骨子里的高雅
  • 2021-01-02 23:51
#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);
编译通不过呢?
最佳答案
  • 五星知识达人网友:一袍清酒付
  • 2021-01-03 01:28
大家都说错了,没说到重点。
这不是什么虚函数限制,主要原因在于函数调用名称解释的问题。按照名称解析规则,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楼网友:往事埋风中
  • 2021-01-03 05:33
b.func(4.5);没问题吧,b的对象调用b的函数,有一个参数为int的一个参数为double的,淡然是调用double的。 a.func(4.5);通过a的引用来调用,当然只能调用a具有的函数。这里a只有一个函数void a::func(int i),所以本来应该只能调用这个,但是它是一个虚函数,在b中重写了,而且a实际上所引用的是一个b的对象。所以,调用的就不是void a::func(int i)而变成b中重写的版本void b::func(int i)。
  • 2楼网友:拜訪者
  • 2021-01-03 04:22
你在derive类中的func也加上了virtual导致基类函数被覆盖,所以肯定错了
  • 3楼网友:往事隔山水
  • 2021-01-03 02:47
在派生类重新定义或者覆写基类的重载函数,会导致继承的名称被遮掩。 在派生类的 public 区域增加 using base::func; 语句可以解决。
  • 4楼网友:由着我着迷
  • 2021-01-03 02:31
虚函数的限制 如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现这种同名函数。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯