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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

静态多态 动态多态

發布時間:2023/11/30 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 静态多态 动态多态 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 靜態多態

1. 何為靜態多態?

又稱編譯期多態,即在系統編譯期間就可以確定程序將要執行哪個函數。例如:函數重載,通過類成員運算符指定的運算。

2. 示例代碼

函數重載示例:

class A { public:A() {}A( int x ) {}void f() {}void f( int x ) {} };class B { public:B() {}void f() {}void f( int x ) {} };

以上,類A中兩個A()是函數重載,兩個f()是函數重載,類B同理。

二. 動態多態

1. 何為動態多態?

動態多態是利用虛函數實現運行時的多態,即在系統編譯的時候并不知道程序將要調用哪一個函數,只有在運行到這里的時候才能確定接下來會跳轉到哪一個函數。
動態多態是在虛函數的基礎上實現的,而實現的條件有:
(1) 在類中聲明為虛函數
(2) 函數的函數名,返回值,函數參數個數,參數類型,全都與基類的所聲明的虛函數相同(否則是函數重載的條件)
(3) 將子類對象的指針(或以引用形式)賦值給父類對象的指針(或引用),再用該指向父類對象的指針(或引用)調用虛函數
如此,便可以實現動態多態,程序會按照實際對象類型來選擇要實行的函數具體時哪一個。

2. 示例代碼

(1) 非多態

#include <iostream> using namespace std;class A { public:A() {}void f() { cout << "A::f() is called.\n"; } };class B : public A { public:B() {}void f() { cout << "B::f() is called.\n"; } };int main() {A a;B b;A *p1 = &a;A *p2 = &b;p1->f();p2->f();return 0; }
運行結果
A::f() is called. A::f() is called.

在這種情況下,我們會發現程序的輸出結果并不是我們想要的,而是兩次調用的f()函數都是基類的。這是因為使用的是基類指針,而且基類中沒有將f()聲明為虛函數,所以每次調用都會使用基類的方法。

(2)多態

#include <iostream> using namespace std;class A { public:A() {}virtual void f() { cout << "A::f() is called.\n"; } };class B : public A { public:B() {}virtual void f() { cout << "B::f() is called.\n"; } };int main() {A a;B b;A *p1 = &a;A *p2 = &b;p1->f();p2->f();return 0; }
運行結果
A::f() is called. B::f() is called.

這樣,也就實現了動態多態,程序可以按照我們期望的方式正確輸出。

三. 總結

建議在基類中,如果含有虛函數,就將類的析構函數聲明為虛析構函數,以避免在調用時發生錯誤。

總結

以上是生活随笔為你收集整理的静态多态 动态多态的全部內容,希望文章能夠幫你解決所遇到的問題。

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