C++成员函数继承后的调用顺序

yuanxingyang 2012-05-10 03:00:50
各位谁能帮忙详细解释一下以下程序,非常感谢!

class Base
{
public:
virtual void f( int iParam){
cout << "Base::f(int)" << endl;
};
virtual void g( int iParam){
cout << "Base::g(int)" << endl;
};
};
class Derived: public Base
{
public:
void f( float fParam){
cout << "Derived::f(float)" << endl;
};
static void g( int iParam){
cout << "Derived::g(int)" << endl;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
Base b;
Derived d;
Base* pb = new Derived;
d.f(10);
pb->f(1.0);
pb->g(10);
delete pb;
return 0;
}
输出结果是:( )
(A) Base::f(int) (B) Derived::f(float)
Derived::f(float) Base::f(float)
Derived::g(int) Derived::g(int)
(C) Base::f(int) (D) Derived::f(float)
Derived::f(float) Base::f(int)
Base::g(int) Base::g(int)
...全文
157 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sheldenwade1 2012-05-10
  • 打赏
  • 举报
回复
C++函数覆盖原则是函数的签名相同,即函数名、参数数量和类型均相同,因此derived::f(float)不会覆盖base::f(int)。对于static类型函数,即使函数签名相同,也不会覆盖,原因很简单。多态性是针对类对象的,没有对象,就没有对象头部那个虚表指针,也就没什么虚函数啊、函数覆盖啊之类的。而static函数是类级别的函数,不需要任何实例化的对象,没有任何实例化的对象,至于那些虚表指针啊神马的就无从存在,无从谈起多态。
W170532934 2012-05-10
  • 打赏
  • 举报
回复
选D
两个f函数的参数类型不一样,从而使得子类的f函数不具备动态绑定的特性了。
而g函数在子类中成了静态函数,当然也不具备了动态绑定的特性了。所以全部调用父类的f和g函数了
hen_hao_ji 2012-05-10
  • 打赏
  • 举报
回复

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧