C/C++—— C++中建構函式不能是虛擬函式的原因分析

readyao發表於2016-04-04

首先:到底能不能將建構函式宣告為虛擬函式?

答案是不能。先看下面例子的編譯結果。

#include <iostream>
using namespace std;

class Parent
{
public:
    virtual Parent(int a = 0)
    {
        this->a = a;
    }

    virtual void print()
    {
        cout<< "Parent." <<endl;
    }
private:
    int a;
};

class Child : public Parent
{
public:
    Child(int b = 0)
    {
        this->b = b;
    }
    virtual void print()
    {
        cout<< "Child."<<endl;
    }
private:
    int b ;
};

int main()
{
    Parent p;

    return 0;
}

編譯輸出結果:
error: constructors cannot be declared virtual [-fpermissive]
virtual Parent(int a = 0)
提示建構函式不能宣告為虛擬函式。。

分析原因:

首先參考部落格:C/C++—— C++編譯器是如何實現多型

先了解vptr指標和虛擬函式表的概念,以及兩者的關係。

vptr指標指向虛擬函式表,執行虛擬函式的時候,會呼叫vptr指標變數指向的虛擬函式表中的虛擬函式。
當定義個物件的時候,首先會分配記憶體空間,然後再執行建構函式對該物件進行初始化構造。vptr變數是在建構函式中進行初始化的。又因為要想執行虛擬函式必須通過vptr變數找到虛擬函式表。(在建構函式初始化vptr變數之前是不會呼叫虛擬函式的)如果可以定義虛建構函式,就陷入了先有雞還是先有蛋的問題。
所以不能將建構函式宣告為虛擬函式。

相關文章