1. 程式人生 > >C++ 建構函式中呼叫虛擬函式

C++ 建構函式中呼叫虛擬函式

我們知道:C++中的多型使得可以根據物件的真實型別(動態型別)呼叫不同的虛擬函式。這種呼叫都是物件已經構建完成的情況。那如果在建構函式中呼叫虛擬函式,會怎麼樣呢?

有這麼一段程式碼:

class A
{
public:
    A ():m_iVal(0){test();}
    virtual void func() { std::cout<<m_iVal<<‘ ’;}
   void test(){func();}
public:
int m_iVal;
};
class B : public A
{
public:
    B(){test();};
    virtual void func()
    {
        ++m_iVal;
        std::cout<<m_iVal<<‘ ’;
}
};
int main(int argc ,char* argv[]) { A*p = new B; p->test(); return 0; }

  輸出: 0 1 2

  也就是說,在建構函式中呼叫虛擬函式,呼叫的是正在構造的類中的虛擬函式,而不是子類的虛擬函式。

  理一下程式。new了一個B物件,首先要呼叫基類建構函式,也就是A類的建構函式。呼叫test(),再呼叫虛擬函式func(),這時候用的是基類版本。之後再呼叫子類B的建構函式,這時呼叫的是子類虛擬函式func()。至於最後一次呼叫func(),根據多型,呼叫的是真實虛擬函式。

相關推薦

C++建構函式呼叫虛擬函式是否有多型的效果

C++多型的一個重要應用就是虛擬函式。但是當我們再基類的建構函式中呼叫一個子類過載的虛擬函式會出現多型的效果嗎?我們具體看一下下面的例項: #include <iostream> #define P(x) std::cout<<x<<std::endl;

C++建構函式呼叫虛擬函式

談談關於建構函式中呼叫虛擬函式的情況,僅討論單繼承,不考慮虛擬繼承和多重繼承。 測試平臺:VS2013 + Win7X64 一個例子: #include <stdlib.h> #i

C/C++—— 在建構函式呼叫虛擬函式能實現多型嗎(Vptr指標初始化的過程分析)

問題引入: 比如:如果我們想在父類的建構函式中呼叫虛擬函式,當定義子類物件的時候,父類的建構函式中的虛擬函式執行的是子類中的函式。 在下面的例子中,定義子類物件的時候,在父類建構函式中的print虛擬函式執行的不是子類中的print函式,而是父類中的prin

C++ 建構函式呼叫虛擬函式

我們知道:C++中的多型使得可以根據物件的真實型別(動態型別)呼叫不同的虛擬函式。這種呼叫都是物件已經構建完成的情況。那如果在建構函式中呼叫虛擬函式,會怎麼樣呢? 有這麼一段程式碼: class A { public: A ():m_iVal(0){test();}

建構函式/解構函式呼叫虛擬函式

先看一段在建構函式中直接呼叫虛擬函式的程式碼: 1 #include <iostream> 2 3 class Base 4 { 5 public: 6 Base() { Foo(); } ///< 列印 1 7 8

多型性---建構函式和解構函式呼叫虛擬函式

參考 C++ primer 15.4.5 /* 建構函式和解構函式中的虛擬函式 */ #include<iostream> using namespace std; class Base { public: //在建構函式和解構函式中呼叫虛擬函式,則執行自身型別定義的版本。原因是初始

為什麼不要在建構函式呼叫虛擬函式

先看一段在建構函式中直接呼叫虛擬函式的程式碼: #include <iostream> class Base { public: Base() { Foo(); } ///< 列印 1 virtual void Foo() { std:

不要在建構函式和解構函式呼叫虛擬函式

提到建構函式和解構函式,想必大家肯定是非常瞭解,但是能否在建構函式或是解構函式中呼叫虛擬函式呢? 答案是千萬不要這麼做,這麼做不會得到大家想要的結果。 首先提一下建構函式,建構函式的順序是從基類開始構造->子類,如果在基類中呼叫虛擬函式,由於建構函式基類中僅存在自身

C++建構函式呼叫虛擬函式嗎?

      環境:XPSP3 VS2005         今天黑總給應聘者出了一個在C++的建構函式中呼叫虛擬函式的問題,具體的題目要比標題複雜,大體情況可以看如下的程式碼: class Base { public: Base() { Fuction(); }

C++進階--建構函式和解構函式虛擬函式

//############################################################################ /* 任何時候都不要在建構函式或解構函式中呼叫虛擬函式 */ class dog { public: string m_name

C++在多層繼承呼叫虛擬函式

在一個類中的虛擬函式說明,只對派生類中重定義的函式有影響,對它的基類中的函式不起作用。 例: #include <iostream> usingnamespacestd; class A { public:     void show()  

C++物件模型虛擬函式分析

對於虛擬函式,知道它的含義,也能夠描述出來。參照百度百科,也就是“它提供了‘動態繫結’機制”。 可總是感覺有些迷糊,於是敲了一段程式碼出來試驗,一探究竟(程式設計環境是VC6.0)。對比程式碼和結果,一切都不言自明。 現在把程式碼和結果貼上來,作為儲存記錄,同時也歡迎大家提出意見,以臻完善。

C++通過虛擬函式呼叫虛擬函式

    C++的類如果有虛擬函式,則該類的第一個成員的數值,是一個地址,指向其虛擬函式表。例如     class CTest { public: virtual void Test1(void) { cout<&l

【lua】C 函式呼叫Lua函式時,對於lua_pcall使用的困惑

最近在學習使用Lua,也通過基本的語法知識完成了公司的一個關於配置檔案引數合法性檢查的小任務。雖然任務完成了,但對於一些函式的呼叫目的還是搞不明白,這兩天再次重看了Manual Reference,稍微梳理出了一點眉目,記錄在此。 首先看一段小小小程式 fun

C 函式呼叫Lua函式時,對於lua_pcall使用的困惑

最近在學習使用Lua,也通過基本的語法知識完成了公司的一個關於配置檔案引數合法性檢查的小任務。雖然任務完成了,但對於一些函式的呼叫目的還是搞不明白,這兩天再次重看了Manual Reference,稍微梳理出了一點眉目,記錄在此。 首先看一段小小小程式 //test.lua

建構函式可以呼叫虛擬函式嗎?語法上通過嗎?語義上可以通過嗎?

牛客網 ------------------- ------------------- ------------------- 設計模式 ------------------- ------------------- (adsbygoogle =

為什麼不能在建構函式使用虛擬函式

先上程式碼: // c_datastructure.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include<iostream> #in

C++ 建構函式,解構函式能否呼叫虛擬函式

牛客網 ------------------- ------------------- ------------------- 設計模式 ------------------- -------------------

C++建構函式呼叫虛擬函式的原因

今天在看網上一篇帖子的時候看到這個問題,試講關於C++物件虛擬函式表和型別資訊的(RTTI)的,正好看到了如下內容: 這個是為什麼在建構函式中不能呼叫虛擬函式的原因 .因為任何時候在基類中的虛擬函式呼叫,都不可能到達子類的實現,因為子類的虛表初始化是在呼叫完基類的構造之後發

建構函式是否可以呼叫虛擬函式

1. 從語法上講,呼叫完全沒有問題。 2. 但是從效果上看,往往不能達到需要的目的。 Effective 的解釋是: 派生類物件構造期間進入基類的建構函式時,物件型別變成了基類型別,而不是派生類型別。 同樣,進入基類解構函式時,物件也是基類型別。 所以,虛擬函式始終僅僅呼叫