C/C++—— C++中建構函式不能是虛擬函式的原因分析
首先:到底能不能將建構函式宣告為虛擬函式?
答案是不能。先看下面例子的編譯結果。
#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變數之前是不會呼叫虛擬函式的)如果可以定義虛建構函式,就陷入了先有雞還是先有蛋的問題。
所以不能將建構函式宣告為虛擬函式。
相關文章
- C++ Daily 《3》----建構函式可否是虛擬函式C++AI函式
- C++ 中的虛擬函式C++函式
- C/C++—— C++中定義虛解構函式的原因C++函式
- C++中的虛擬函式與虛擬函式表 (轉)C++函式
- C++ 虛擬函式C++函式
- C++虛擬函式C++函式
- C++中虛擬函式的作用C++函式
- C++中抽象類、虛擬函式和純虛擬函式C++抽象函式
- C++箴言:避免解構函式呼叫虛擬函式C++箴言函式
- C++之類解構函式為什麼是虛擬函式C++函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- C++ 建構函式和解構函式C++函式
- c++虛擬函式表C++函式
- C++虛擬函式bugC++函式
- 【C++】建構函式C++函式
- C++建構函式C++函式
- C++中的虛擬函式(virtual function)C++函式Function
- C++ 類建構函式和解構函式C++函式
- C++ 介面(純虛擬函式)C++函式
- C++ 虛擬函式表剖析C++函式
- C++ 虛擬函式表解析C++函式
- C++函式中那些不可以被宣告為虛擬函式的函式C++函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式
- c++中內建函式C++函式
- 深入C++成員函式及虛擬函式表C++函式
- C++多型之虛擬函式C++多型函式
- C++虛擬函式解析(轉載)C++函式
- C++入門記-建構函式和解構函式C++函式
- [C++]顯示呼叫建構函式和解構函式C++函式
- C/C++——建構函式、複製建構函式和解構函式的執行時刻C++函式
- C++複製建構函式C++函式
- c++建構函式詳解C++函式
- C++的虛解構函式的作用C++函式
- C++多型(上)——虛擬函式、虛表C++多型函式
- C++建構函式解構函式的執行過程C++函式
- 詳解C++中的多型和虛擬函式C++多型函式