2017-05-27 15 views
1

initを引き締め、派生クラスのオブジェクト - 以下のコードで

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を使用しないでください。 –

+0

@ manni66 'malloc()'はCで使うべきですか?私たちはmalloc()のC++バージョンを持っていますか? – overexchange

答えて

3

これは、クラスは、基本クラスを持つことができない法的なことを集約初期化のために、aggregate initializationです:

なし、仮想プライベート、または保護された基底クラス(C++ 17以降)

Childは明らかに基本クラス(Base)を持っているため、エラーが発生します。


はやはりこれがある限り、基本クラスは、仮想プライベートまたは保護されていないとして、C++ 17に許可されます、同じリンクに記載されています。

+0

私はg ++バージョン5.4を持っています。 '-std = C++ 17'オプションを与えても、GNU C++ 14を起動します。どのバージョンのg ++​​がC++ 17構文をサポートしていますか? – overexchange