为了账号安全,请及时绑定邮箱和手机立即绑定

被覆盖的父类成员函数还是可以被调用的

就这次的作业题来看,如果运行

Animal *p = new Dog();

p->eat();//Dog--eat()

p->Animal::eat();//Animal--eat()

表明,并没有被覆盖掉呀??怎么回事?

正在回答

5 回答

隐藏就这么用

0 回复 有任何疑惑可以回复我~

覆盖只是在虚函数列表中将函数指针替换掉。 如果通过类去访问,还是可以访问的。

0 回复 有任何疑惑可以回复我~

指针可以指向不同的对象,可以指动物也可以指狗,当然此处默认为指向狗。覆盖仅指父类中有virtual修饰的函数且子类中刚好有同名函数,则发生覆盖,即子类虚函数表中的子类虚函数入口地址的值会覆盖掉此子类虚函数表中的父类的虚函数入口地址的值。

0 回复 有任何疑惑可以回复我~

指针p虽然指向Dog的对象,但是指针p依然是父类Animal的一部分。用指针p依然可以调用Animal的虚表,通过虚表指针调用其成员函数!

0 回复 有任何疑惑可以回复我~

#include <iostream>

#include <stdlib.h>

#include <string>

using namespace std;


/**

 *  定义动物类:Animal

 *  成员函数:eat()、move()

 */

class Animal

{

public:

    // 构造函数

    Animal(){cout << "Animal" << endl;}

    // 析构函数

virtual ~Animal(){cout << "~Animal" << endl;}

    // 成员函数eat()

virtual  void eat(){cout << "Animal -- eat" << endl;}

    // 成员函数move()

virtual void move(){cout << "Animal -- move" << endl;}

};


/**

 * 定义狗类:Dog

 * 此类公有继承动物类

 * 成员函数:父类中的成员函数

 */

class Dog : public Animal

{

public:

    // 构造函数

Dog(){cout << "Dog" << endl;}

    // 析构函数

virtual ~Dog(){cout << "~Dog" << endl;}

    // 成员函数eat()

virtual  void eat(){cout << "Dog -- eat" << endl;}

    // 成员函数move()

virtual void move(){cout << "Dog -- move" << endl;}

};


int main(void)

{

    // 通过父类对象实例化狗类

Animal *p=new Dog();

    // 调用成员函数

p->eat();

p->Animal::eat();//依然可以运行这句话,什么情况?

    p->move();

    // 释放内存

    delete p;

    p=NULL;

    

return 0;

}


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之多态篇
  • 参与学习       66223    人
  • 解答问题       334    个

本教程将带领大家体会面向对象三大特性中的多态特性

进入课程

被覆盖的父类成员函数还是可以被调用的

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号