[英]C++ base class constructor with default parameters
我寫了這個小程序來測試我的理解。 我無法理解的是構造函數沒有被繼承,但是類B能夠調用類A的構造函數!
#include <iostream>
using namespace std;
class A {
public:
A(int x = 2) { //Constructor A
num = x;
}
int getNum() {
return num;
}
protected:
int num;
};
class B: public A { //Constructor B
public:
B() {
A(5);
}
};
int main() {
A a(3); //create obj a with num = 3
B b; //create obj b
cout << a.getNum() << endl;
cout << b.getNum() << endl;
return 0;
}
輸出為:
3
2
構造函數A的調用到底做了什么? 它沒有使用傳遞的參數來初始化對象b的編號!
此外,如果我從類A的構造函數中刪除默認值,則會出現編譯錯誤:
no matching function for call to 'A::A()'
那么,這里到底發生了什么?
我知道正確的方法是:
class B: public A { //Constructor B
public:
B() : A(5) {
}
};
給出輸出:
3
5
但這只是出於理解的目的。
讓我們看一下B
構造函數:
B() {
A(5);
}
在這里,您實際上兩次 “調用”了A
構造函數。 一次作為B
構造的一部分(在其中稱為“默認” A
構造函數),一次在B
構造函數體內創建一個臨時對象 。
順序如下
B
構造函數稱為 B
對象初始化的一部分調用A
默認構造函數 B
構造函數的主體 5
) A
非默認構造函數 B
構造函數的主體退出
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.