2016-12-07 1 views
-2

私はこのコードを試してみましたが、私はC++に新しいですし、学ぼうと、このコンパイルエラーC++、子クラスオブジェクトを親クラスタイプにキャストするか、逆も可能です。

class A{ 
}; 
class B : public A{ 
}; 
int main() 
{ 
A a = new B(); // ERROR: "No suitable constructor exists to convert from "B*" to "A". 

B b = new A(); // ERROR: "No suitable constructor exists to convert from "A*" to "B". 
} 

を得ます。誰かが私にこれを理解するのを助けることができるか?

+0

' *のA =新しいB():

は第二に、あなたは明示的にダウンキャストすなわちを行う必要があります。逆の方法は不可能です。 –

+0

あなたは[オンラインコンパイラ](http://coliru.stacked-crooked.com/)を使ってコンパイルするものをテストすることができます – sp2danny

+0

@πάνταῥεῖ:ありがとう。私は何が欠けていたかを理解する。 A * a = new B();働いた。 – HimNG

答えて

1

唯一の意味は、派生クラスを含む親タイプを持つことです。これにより、派生クラスのすべての仮想メソッドと親クラスの非仮想メソッドを呼び出すことができます。また、このように保存されたとき、あなたは親クラス(例えばA* a = dynamic_cast<A*>(new B());)に派生からそれをdynamic_castをすることができます
他の例のようになります。すべての

std::vector<A> vec; 
vec.push_back(B()); 
A* ptr = new B(); 
std::unique_ptr<A> unique = std::make_unique<B>(); 
1

まず、あなたはポインタオブジェクトを扱っている新しいときにのみ使用します。

よう
A * a = new A(); 

他の賢明な利用 A; ;これは、ポインタを生成するよう `コンパイルします

B * b = (B*) (new A()); 
+2

'A();'は関数宣言です。たぶんあなたは 'A a; 'を意味するかもしれません –

+1

@Misgevolutionあなたはおそらく後者のコードスニペットでダウンキャストを意味しました – FdeF

+0

@FdeFはい、ありがとうございます。 – Misgevolution

関連する問題