被覆蓋的父類成員函數還是可以被調用的
就這次的作業題來看,如果運行
Animal *p = new Dog();
p->eat();//Dog--eat()
p->Animal::eat();//Animal--eat()
表明,并沒有被覆蓋掉呀??怎么回事?
就這次的作業題來看,如果運行
Animal *p = new Dog();
p->eat();//Dog--eat()
p->Animal::eat();//Animal--eat()
表明,并沒有被覆蓋掉呀??怎么回事?
2018-08-05
舉報
2020-05-02
隱藏就這么用
2019-02-12
覆蓋只是在虛函數列表中將函數指針替換掉。 如果通過類去訪問,還是可以訪問的。
2018-10-11
指針可以指向不同的對象,可以指動物也可以指狗,當然此處默認為指向狗。覆蓋僅指父類中有virtual修飾的函數且子類中剛好有同名函數,則發生覆蓋,即子類虛函數表中的子類虛函數入口地址的值會覆蓋掉此子類虛函數表中的父類的虛函數入口地址的值。
2018-08-22
指針p雖然指向Dog的對象,但是指針p依然是父類Animal的一部分。用指針p依然可以調用Animal的虛表,通過虛表指針調用其成員函數!
2018-08-05
#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;
}