猿问

关于c++一个多态的问题

A派生B,B派生C,现在A,B,C都有一个disp函数(同名同参)用来输出自己的类名。
现在是这样的
C *c = new C;
B *b = c; //注意这里用的是B
b->disp(); 

//当A,B,C的disp函数都不用virtual修饰,输出结果是B
//如果只给A的disp函数使用virtual修饰,我本来以为还是输出B,但实际上输出了C。
那么为什么?

摇曳的蔷薇
浏览 659回答 1
1回答

暮色呼如

你其实对virtual关键字的继承关系有误解。你的直观感觉是“我只给A的disp函数添加了virtual修饰”,但事实是,由于编译器检测到B中的disp()函数是A中的虚函数disp的重载形式,该函数也自动成为virtual函数,不论你是否显式声明了virtual关键字。然后,根据继承关系,C中的disp也同理。
随时随地看视频慕课网APP
我要回答