基类指针调用派生类函数_C++ 多态性:虚函数--基类与派生类类型转换(第7章 05)例子问题解析(学习笔记:第8章 05)...
生活随笔
收集整理的這篇文章主要介紹了
基类指针调用派生类函数_C++ 多态性:虚函数--基类与派生类类型转换(第7章 05)例子问题解析(学习笔记:第8章 05)...
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
虛函數(shù)[1]
問(wèn)題:還記得第7章的例子嗎[2]?
例7-3 類型轉(zhuǎn)換規(guī)則舉例
#include <iostream> using namespace std; class Base1 { //基類Base1定義 public:void display() const {cout << "Base1::display()" << endl;} }; class Base2 : public Base1 { //公有派生類Base2定義 public:void display() const {cout << "Base2::display()" << endl;} }; class Derived : public Base2 { //公有派生類Derived定義 public:void display() const {cout << "Derived::display()" << endl;} };void fun(Base1 *ptr) { //參數(shù)為指向基類對(duì)象的指針ptr->display(); //"對(duì)象指針->成員名" } int main() { //主函數(shù)Base1 base1; //聲明Base1類對(duì)象Base2 base2; //聲明Base2類對(duì)象Derived derived; //聲明Derived類對(duì)象fun(&base1); //用Base1對(duì)象的指針調(diào)用fun函數(shù)fun(&base2); //用Base2對(duì)象的指針調(diào)用fun函數(shù)fun(&derived); //用Derived對(duì)象的指針調(diào)用fun函數(shù)return 0; }程序運(yùn)行結(jié)果:
對(duì)程序的一些說(shuō)明:
程序的本意時(shí)希望能夠?qū)懸粋€(gè)通用的顯示函數(shù)fun(),根據(jù)需要指向不同的派生對(duì)象,然后調(diào)用各自display函數(shù)。但是沒(méi)有達(dá)到這個(gè)期望的效果。運(yùn)行結(jié)果都是調(diào)用Base1的display函數(shù)。所以建議不要重新定義繼承而來(lái)的非虛函數(shù)。
- 為什么程序沒(méi)有達(dá)到期望效果?
在編譯階段,編譯器根據(jù)指針無(wú)法去判斷在運(yùn)行時(shí)它會(huì)指向一個(gè)什么類型的對(duì)象。
- 用虛函數(shù)能解決上述問(wèn)題的原理:
在編譯階段沒(méi)法正確地決定,就推遲這個(gè)決定,留到運(yùn)行時(shí)在確定。程序運(yùn)行時(shí)就能夠知道指針在某個(gè)時(shí)刻指向的實(shí)際對(duì)象。
- 怎么實(shí)現(xiàn)上述原理:
添加一個(gè)virtual關(guān)鍵字即可。它的意思是指示編譯器不要在編譯階段做靜態(tài)綁定,要為運(yùn)行階段做動(dòng)態(tài)綁定做好準(zhǔn)備。
注意:加了virtual的虛函數(shù)都要在類外去實(shí)現(xiàn)函數(shù)體,不能寫(xiě)成內(nèi)聯(lián)函數(shù)(因?yàn)閮?nèi)聯(lián)函數(shù)是靜態(tài)綁定的)。
例8-4通過(guò)虛函數(shù)實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)
現(xiàn)在我們來(lái)改進(jìn)一下第7章的程序:同原型的函數(shù)在類外寫(xiě)成虛函數(shù)。
#include <iostream> using namespace std;class Base1 { public:virtual void display() const; //虛函數(shù) }; void Base1::display() const {cout << "Base1::display()" << endl; }class Base2 : public Base1 { public:virtual void display() const; }; void Base2::display() const {cout << "Base2::display()" << endl; } class Derived : public Base2 { public:virtual void display() const; }; void Derived::display() const {cout << "Derived::display()" << endl; }void fun(Base1 *ptr) {ptr->display(); }int main() {Base1 base1;Base2 base2;Derived derived;fun(&base1);fun(&base2);fun(&derived);return 0; }程序運(yùn)行結(jié)果:
參考
總結(jié)
以上是生活随笔為你收集整理的基类指针调用派生类函数_C++ 多态性:虚函数--基类与派生类类型转换(第7章 05)例子问题解析(学习笔记:第8章 05)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用python给女朋友惊喜100天快乐_
- 下一篇: 编译QT出错 Basic XLib fu