被覆蓋的父類成員函數(shù)還是可以被調(diào)用的
就這次的作業(yè)題來(lái)看,如果運(yùn)行
Animal *p = new Dog();
p->eat();//Dog--eat()
p->Animal::eat();//Animal--eat()
表明,并沒(méi)有被覆蓋掉呀??怎么回事?
就這次的作業(yè)題來(lái)看,如果運(yùn)行
Animal *p = new Dog();
p->eat();//Dog--eat()
p->Animal::eat();//Animal--eat()
表明,并沒(méi)有被覆蓋掉呀??怎么回事?
2018-08-05
舉報(bào)
2020-05-02
隱藏就這么用
2019-02-12
覆蓋只是在虛函數(shù)列表中將函數(shù)指針替換掉。 如果通過(guò)類去訪問(wèn),還是可以訪問(wèn)的。
2018-10-11
指針可以指向不同的對(duì)象,可以指動(dòng)物也可以指狗,當(dāng)然此處默認(rèn)為指向狗。覆蓋僅指父類中有virtual修飾的函數(shù)且子類中剛好有同名函數(shù),則發(fā)生覆蓋,即子類虛函數(shù)表中的子類虛函數(shù)入口地址的值會(huì)覆蓋掉此子類虛函數(shù)表中的父類的虛函數(shù)入口地址的值。
2018-08-22
指針p雖然指向Dog的對(duì)象,但是指針p依然是父類Animal的一部分。用指針p依然可以調(diào)用Animal的虛表,通過(guò)虛表指針調(diào)用其成員函數(shù)!
2018-08-05
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
/**
?*? 定義動(dòng)物類:Animal
?*? 成員函數(shù):eat()、move()
?*/
class Animal
{
public:
? ? // 構(gòu)造函數(shù)
? ? Animal(){cout << "Animal" << endl;}
? ? // 析構(gòu)函數(shù)
virtual ~Animal(){cout << "~Animal" << endl;}
? ? // 成員函數(shù)eat()
virtual? void eat(){cout << "Animal -- eat" << endl;}
? ? // 成員函數(shù)move()
virtual void move(){cout << "Animal -- move" << endl;}
};
/**
?* 定義狗類:Dog
?* 此類公有繼承動(dòng)物類
?* 成員函數(shù):父類中的成員函數(shù)
?*/
class Dog : public Animal
{
public:
? ? // 構(gòu)造函數(shù)
Dog(){cout << "Dog" << endl;}
? ? // 析構(gòu)函數(shù)
virtual ~Dog(){cout << "~Dog" << endl;}
? ? // 成員函數(shù)eat()
virtual? void eat(){cout << "Dog -- eat" << endl;}
? ? // 成員函數(shù)move()
virtual void move(){cout << "Dog -- move" << endl;}
};
int main(void)
{
? ? // 通過(guò)父類對(duì)象實(shí)例化狗類
Animal *p=new Dog();
? ? // 調(diào)用成員函數(shù)
p->eat();
p->Animal::eat();//依然可以運(yùn)行這句話,什么情況?
? ? p->move();
? ? // 釋放內(nèi)存
? ? delete p;
? ? p=NULL;
? ??
return 0;
}