C++ 重载、隐藏、覆盖
解决时间 2021-03-20 02:12
- 提问者网友:感性作祟
- 2021-03-19 05:19
#include
using namespace std;
class Base
{
public:
void fun() {cout<<"Base called!"<};
class Derived:public Base
{
public:
void fun() {cout<<"Derived called!"<};
int main()
{
Base bas,*p;
Derived der;
p = &bas;
p->fun(); //Base called!
p = &der;
p->fun(); //Derived called!
return 0;
}
输出结果分析?
最佳答案
- 五星知识达人网友:枭雄戏美人
- 2021-03-19 05:40
由于fun()函数不是virtual,那么调用时只会根据指针的静态类型来确定调用哪个函数。
这里的p是Base*类型,那么就是说其静态类型是指向Base类型对象的指针。
所以都只会调用Base::func()函数。
只有当fun()函数是virtual时,才会根据指针的动态类型确定调用哪个函数。
全部回答
- 1楼网友:舍身薄凉客
- 2021-03-19 07:57
如果父类的Public函数不为虚,这样这个函数为静态绑定。用父类对象始终是指向父类的fun()函数。
如果在父类fun()前加上virtual关键字。
p = &der;
p->fun(); //Derived called!
这两行语句可以调用子类的fun()。
其实你说的基类指针和派生类指针的问题,本质是virtual的影响。
对于标识为virtual的函数,其函数列表会被派生类更新,所以不管使用哪种调用方式都会是子类的方法。
对于非virtual的函数,其函数列表不会被更新,仅仅是添加了新的函数。在子类调用时,由于后添加的将原来的隐藏了,所以是调用子类的方法;而如果使用父类指针调用,由于在父类的函数列表中是没有子类的函数的,所以就变成了父类的函数。
至于重载,它是指相同的方法名称却有不同的调用参数(据说有的语言可以支持返回类型的重载)。
我要举报
大家都在看
推荐资讯