#include<iostream.h>class mammal{public:mammal():itsage(1){}virtual~mammal(){}virtual void speak()const{cout<<"mammal speak!\n";}protected:int itsage;};class dog:public mammal{public:void speak()const{cout<<"woof!\n";}};class cat:public mammal{public:void speak()const{cout<<"meow!\n";}void valuefunction(mammal);void ptrfunction(mammal*);void reffunction(mammal&);int main(){mammal*ptr=0;int choice;while(1){bool fquit=false;cout<<"(1)dog(2)cat(0)quit:";cin>>choice;switch(choice){case 0:fquit=true;break;case 1:ptr=new dog;break;case 2:ptr=new cat;break;default:ptr=new mammal;break;}if(fquit)break;ptrfunction(ptr); //錯了吧?reffunction(*ptr); //錯了吧?valuefunction(*ptr); //錯了吧?}return 0;}void valuefunction(mammal mammalvalue){mammalvalue.speak();}void ptrfunction(mammal*pmammal){pmammal->speak();}void reffunction(mammal&rmammal){rmammal.speak();}(1)dog(2)cat(0)quit:1woofwoofmammal speak! //怎么來的?(1)dog(2)cat(0)quit:2meow!meow!mammal speak! //怎么來的?(1)dog(2)cat(0)quit:0
1 回答

森欄
TA貢獻1810條經驗 獲得超5個贊
這是我學虛函數時的筆記,看完你應該自己能解決上面你的問題了:
1)將基類某函數申明為虛函數,說明基類準備讓子類在其中修改該函數的實現
2)如果僅是子類中對基類的A()函數重寫,則基類對象調用A()時,仍調用基類中A()的實現,而子類對象調用A()時,調用子類中A()的實現
3)如果基類的A()申明為虛函數,則基類對象調用A()時,調用的是子類中A()的實現,即通過基類指針可以訪問派生類的虛方法
- 1 回答
- 0 關注
- 299 瀏覽
添加回答
舉報
0/150
提交
取消