亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

被覆蓋的父類成員函數還是可以被調用的

就這次的作業題來看,如果運行

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++遠征之多態篇
  • 參與學習       66224    人
  • 解答問題       334    個

本教程將帶領大家體會面向對象三大特性中的多態特性

進入課程

被覆蓋的父類成員函數還是可以被調用的

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號