私はクラスBでのオブジェクトの種類を確認します。チェックaはタイプAのオブジェクトの場合A.</p> <pre><code>class A { }; class B : public A { }; </code></pre> <p>そして、私は3つのオブジェクトを持っているから継承C++ 11
A* a = new A();
A* a2 = new B();
B* b = new B();
私がしたい、A2がタイプB(ないA)のオブジェクトであり、BはタイプB
の目的であるIは、比較を入力しようとしたが、それは私に正解を与えません。
cout << (typeid(*a) == typeid(A)) << endl; // -> 1
cout << (typeid(*a2) == typeid(A)) << endl; // -> 1
cout << (typeid(*b) == typeid(A)) << endl; // -> 0
cout << (typeid(*a) == typeid(B)) << endl; // -> 0
cout << (typeid(*a2) == typeid(B)) << endl; // -> 0
cout << (typeid(*b) == typeid(B)) << endl; // -> 1
コンパイルエラーが発生しました。
B* derived = dynamic_cast<B*>(a);
if (derived) {
cout << "a is B";
}
derived = dynamic_cast<B*>(a2);
if (derived) {
cout << "a2 is B";
}
derived = dynamic_cast<B*>(b);
if (derived) {
cout << "b is B";
}
typename.cpp: In function 'int main(int, char**)':
typename.cpp:27:36: error: cannot dynamic_cast 'a' (of type 'class A*') to type 'class B*' (source type is not polymorphic)
B* derived = dynamic_cast<B*>(a);
^
typename.cpp:31:34: error: cannot dynamic_cast 'a2' (of type 'class A*') to type 'class B*' (source type is not polymorphic)
derived = dynamic_cast<B*>(a2);
私はスタティックキャスティングを使用しましたが、私は答えが間違っています。
B* derived = static_cast<B*>(a);
if (derived) {
cout << "a is B"; // -> YES
}
derived = static_cast<B*>(a2);
if (derived) {
cout << "a2 is B"; // -> YES
}
derived = dynamic_cast<B*>(b);
if (derived) {
cout << "b is B"; // -> YES
}
C++11でオブジェクトタイプを正しく識別するにはどうすればよいですか?
'* a'は' A'型で、 '* b'はその宣言ごとに' B'型です。 –
動的キャストは仮想でしか機能しませんが、コードには仮想機能はありません。 –
コードに似た最適な最小限のソリューション:http://coliru.stacked-crooked.com/view?id=7150bf0db7988cf1d2988aba99c72392-3b440a87a52fe2ae7c853c82f4c5144f – chris