日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

基类指针调用派生类函数_C++ 多态性:虚函数--基类与派生类类型转换(第7章 05)例子问题解析(学习笔记:第8章 05)...

發布時間:2024/9/3 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基类指针调用派生类函数_C++ 多态性:虚函数--基类与派生类类型转换(第7章 05)例子问题解析(学习笔记:第8章 05)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

虛函數[1]

問題:還記得第7章的例子嗎[2]

例7-3 類型轉換規則舉例

#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) { //參數為指向基類對象的指針ptr->display(); //"對象指針->成員名" } int main() { //主函數Base1 base1; //聲明Base1類對象Base2 base2; //聲明Base2類對象Derived derived; //聲明Derived類對象fun(&base1); //用Base1對象的指針調用fun函數fun(&base2); //用Base2對象的指針調用fun函數fun(&derived); //用Derived對象的指針調用fun函數return 0; }

程序運行結果:

對程序的一些說明:

程序的本意時希望能夠寫一個通用的顯示函數fun(),根據需要指向不同的派生對象,然后調用各自display函數。但是沒有達到這個期望的效果。
運行結果都是調用Base1的display函數。所以建議不要重新定義繼承而來的非虛函數。
  • 為什么程序沒有達到期望效果?

在編譯階段,編譯器根據指針無法去判斷在運行時它會指向一個什么類型的對象。

  • 用虛函數能解決上述問題的原理:

在編譯階段沒法正確地決定,就推遲這個決定,留到運行時在確定。程序運行時就能夠知道指針在某個時刻指向的實際對象。

  • 怎么實現上述原理:

添加一個virtual關鍵字即可。它的意思是指示編譯器不要在編譯階段做靜態綁定,要為運行階段做動態綁定做好準備。

注意:加了virtual的虛函數都要在類外去實現函數體,不能寫成內聯函數(因為內聯函數是靜態綁定的)。

例8-4通過虛函數實現運行時多態

現在我們來改進一下第7章的程序:同原型的函數在類外寫成虛函數。

#include <iostream> using namespace std;class Base1 { public:virtual void display() const; //虛函數 }; 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; }

程序運行結果:

參考

  • ^http://www.xuetangx.com/courses/course-v1:TsinghuaX+00740043_2x_2015_T2+sp/courseware/93f0d3a029d84059a84d02745a1e2bfd/62b1f428ccb14e7bafa80cc5be4519b6/
  • ^https://zhuanlan.zhihu.com/p/103992675
  • 總結

    以上是生活随笔為你收集整理的基类指针调用派生类函数_C++ 多态性:虚函数--基类与派生类类型转换(第7章 05)例子问题解析(学习笔记:第8章 05)...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。