У меня есть класс B, который наследуется от A.
class A
{
};
class B : public A
{
};
И у меня есть три объекта.
A* a = new A();
A* a2 = new B();
B* b = new B();
Я хотел бы проверить, является ли a объектом типа A, a2 является объектом типа B (не A), а b является объектом типа B.
Я пробовал типизированное сравнение, но это не дает мне правильного ответа.
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
согласно их объявлению. - person K-ballo   schedule 20.06.2013