<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # C++ 中的虛函數:運行時多態 > 原文: [https://beginnersbook.com/2017/09/cpp-virtual-functions-runtime-polymorphism/](https://beginnersbook.com/2017/09/cpp-virtual-functions-runtime-polymorphism/) 在本指南中,我們將看到**什么是虛函數以及我們使用它們的原因**。當我們在一個類中將一個函數聲明為虛函數時,所有覆蓋此函數的子類默認情況下的函數實現為虛函數(無論它們是否標記為虛擬)。 **為什么我們聲明一個虛函數?** 讓編譯器知道需要在運行時解析對此函數的調用(也稱為**晚期綁定**和動態鏈接),以便確定對象類型并且調用函數的正確版本。 讓我們舉個例子來理解當我們不將[覆蓋函數](https://beginnersbook.com/2017/09/cpp-function-overriding/)標記為虛擬時會發生什么。 ## 示例 1:覆蓋非虛函數 在這里看到問題。即使我們指向子類的實例(對象)的父類指針,也會調用該函數的父類版本。 您可能在想我為什么創建指針,我可以簡單地創建子類的對象,如下所示:`Dog obj;`并將`Dog`實例分配給它。好吧,在這個例子中我只有一個子類,但是當我們有一個包含多個子類的大項目時,不建議單獨創建子類的對象,因為它增加了復雜性并且代碼容易出錯。在此示例之后更加清晰。 ```cpp #include<iostream> using namespace std; //Parent class or super class or base class class Animal{ public: void animalSound(){ cout<<"This is a generic Function"; } }; //child class or sub class or derived class class Dog : public Animal{ public: void animalSound(){? ? ? ?cout<<"Woof"; ? } }; int main(){ Animal *obj; obj = new Dog(); obj->animalSound(); return 0; } ``` **輸出:** ```cpp This is a generic Function ``` ## 示例 2:使用虛函數 在這種情況下,輸出是`Woof`,這是我們所期望的。在這種情況下會發生什么?由于我們將函數`animalSound()`標記為虛擬,因此在運行時解析對函數的調用,編譯器在運行時確定對象的類型并調用適當的函數。 ```cpp #include<iostream> using namespace std; //Parent class or super class or base class class Animal{ public: virtual void animalSound(){ cout<<"This is a generic Function"; } }; //child class or sub class or derived class class Dog : public Animal{ public: void animalSound(){? ? ? ?cout<<"Woof"; ? } }; int main(){ Animal *obj; obj = new Dog(); obj->animalSound(); return 0; } ``` 輸出: ```cpp Woof ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看