簡體   English   中英

C ++繼承初始化列表

[英]C++ inheritance initializer list

我是C++新手,但我來自Java背景,所以我理解大多數OOP概念。 我正在閱讀介紹性指南,我遇到了這個例子:

[Foo.H] 
class A
{
    public:
       A(int something);
};

class B : public A
{
    public:
       B(int something);
};

[Foo.C] 
#include "Foo.H"

A::A(int something)
{
    printf("Something = %d\n", something);
}

B::B(int something) : A(something)
{
}

假設通過將A(something)傳遞給B::B(int something)的初始化列表是正確的,它類似於java中的super關鍵字 - 也就是說,它將執行A::A(int something) '代碼? 另外,為什么我只從initalizer列表中調用A(something)而不是A::A(something)

基本上我要問的是:以上是否等同於此:

B::B(int something)
{
    A::A(something)
}

讓我來解釋為什么我感到困惑。

如果我使用:

B::B(int something) : A(something)
{
    int x = 5;
    printf("x = %d", x);
}

並通過調用代碼

B::B(7);

這會首先打印x = 5或者something = 7嗎? 為什么它會按此順序執行?

我只是對語法有點困惑,這使得很難掌握和可視化即使在這個簡單的例子中發生的繼承。

是的, A(something)傳遞的價值就像super 您不必使用A::A因為該語言會自動將基類名稱注入子類。

但它並不等同於

B::B(int something)
{
    A::A(something)
}

因為那不是合法的代碼。 您只能在初始化列表中選擇要調用的父構造函數。

至於你關於印刷的問題......你試過嗎? 你會看到父something=先打印后跟x=

不,他們不等同

除非你在初始化列表中明確地告訴它,否則子類的構造函數將調用其父類的默認構造函數。

B::B( int something ) {}將隱式調用A::A() ,如果A沒有默認構造函數,則不會編譯。

B::B(int something)
{
    A::A(something)
}

這樣做是因為它試圖在初始化列表中隱式調用A::A() ,然后調用A::A(something) ,因為你知道它不會編譯給定A沒有默認構造函數。

所以如果你想調用不同的父構造函數,那么唯一的方法就是在初始化列表中

B::B(int something) : A(something) {}
A::A(int something)
{
    printf("Something = %d\n", something);
}

這是B的構造函數。構造函數所做的第一件事是構造它的基類(按照在類中聲明的順序,而不是構造函數的順序),然​​后構造成員對象(按類中聲明的順序) ,而不是按構造函數的順序),然​​后它執行主體( {}的代碼)。 這樣做的原因是因為B 一個A對象,所以它必須是一個完整的A才能開始成為一個B對象。 並且在執行任何成員函數的代碼之前必須完全構造所有成員,否則可能發生不好的事情。 因此,必須在構造函數體開始之前構造基類和成員。

如果要更改基類或成員的初始化方式(例如,傳遞整數而不是默認構造),可以將其放在初始化列表中:

B::B(int something) : A(something)
{
    int x = 5;
    printf("x = %d", x);
}

您不必限定A的構造函數的名稱,因為我們已經在對象B的上下文中,並且B已經知道A

B::B(int something)
{
    A::A(something)
}

此代碼無效,因為B將在{} 執行主體之前構造它的A對象。 因為A已經建立,調用A::A在體內是沒有意義的,編譯器會診斷此。

B::B(int something) : A(something)
{
    int x = 5;
    printf("x = %d", x);
}

如前所述,在構造B時,它首先構造基類,然后構造成員,然后執行主體。 所以你會看到

something = 7
x = 5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM