Tôi có lớp B kế thừa từ A.Kiểm tra các loại đối tượng trong C++ 11
class A
{
};
class B : public A
{
};
Và tôi có ba đối tượng.
A* a = new A();
A* a2 = new B();
B* b = new B();
Tôi muốn nếu kiểm tra một là đối tượng của loại A, a2 là đối tượng của loại B (không A), và b là đối tượng của loại B.
tôi đã cố gắng gõ so sánh, nhưng nó không cho tôi câu trả lời đúng.
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
Tôi đã thử truyền động nhưng tôi đã gặp phải lỗi biên dịch.
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);
Tôi đã sử dụng phép đúc tĩnh nhưng tôi đã nhận được câu trả lời sai.
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
}
Làm cách nào để xác định đúng loại đối tượng trong C++11?
'* a' thuộc loại' A' và '* b' thuộc loại' B' trên mỗi khai báo của chúng. –
Truyền động sẽ chỉ hoạt động với ảo nhưng mã của bạn không có bất kỳ chức năng ảo nào. –
Giải pháp tối thiểu tốt nhất tương tự như mã của bạn: http://coliru.stacked-crooked.com/view?id=7150bf0db7988cf1d2988aba99c72392-3b440a87a52fe2ae7c853c82f4c5144f – chris