2017-05-27 105 views
1

在下面的代碼,派生類對象 - 撐初始化

struct X 
{ 
    int a; 
    int b; 
    void *ptr; 
}; 

class Base 
{ 
public: 
    int a; 
    int b; 
    void *ptr; 
}; 

class Child : public Base 
{ 
public: 
    int c; 
}; 

X obj = { 9, 2, malloc(TWOBYTES), }; 
Base obj1 = { 3, 4, malloc(TWOBYTES), }; 
Child obj2 = { 8, 4, malloc(TWOBYTES), 10, }; // Error 

error: could not convert ‘{8, 4, malloc(2ul), 10}’ from ‘<brace-enclosed initializer list>’ to ‘Child’ 
    Child obj2 = { 8, 4, malloc(TWOBYTES), 10, }; 
              ^

obj2不會被初始化

問:

爲什麼b raced-init語法不適用於Child類?

+0

你以什麼順序初始化'a','b','c'&'ptr'(以及爲什麼)?無論如何,這是不允許的*,因爲C++標準是這樣說的*。 –

+0

不要在C++中使用malloc。 – 2017-05-27 16:26:52

+0

@ manni66'malloc()'應該在C中使用嗎?我們有C++版本的malloc()嗎? – overexchange

回答

3

這是aggregate initialization,對於集合初始化爲合法一類不能有一個基類:

沒有虛擬的,私人的,或受保護的(因爲C++ 17)基類

Child顯然確實有一個基類(Base),因此你會得到一個錯誤。


正如在同一鏈接中所述,只要基類不是虛擬的,私有的或受保護的,就可以在C++ 17中使用。

+0

我有g ++版本5.4。儘管我給了'-std = C++ 17'選項,它會調用GNU C++ 14。哪個版本的g ++支持C++ 17語法? – overexchange