C++ 如何在运行时检查类型?
我尝试检查指向作为参数传递的类型的指针,如下所示:C++ 如何在运行时检查类型?,c++,casting,C++,Casting,我尝试检查指向作为参数传递的类型的指针,如下所示: #include <iostream> struct A{}; struct B:A{}; struct C:A{}; C *c = new C; B *b = new B; A *a = new A; void foo (A *a) { if(dynamic_cast<B*>(a)) { std::cout << "Type is B*" << std::endl
#include <iostream>
struct A{};
struct B:A{};
struct C:A{};
C *c = new C;
B *b = new B;
A *a = new A;
void foo (A *a)
{
if(dynamic_cast<B*>(a))
{
std::cout << "Type is B*" << std::endl;
//cannot dynamic_cast 'a' (of type 'struct A*') to type 'struct B*' (source type is not polymorphic)
}
if(dynamic_cast<C*>(a))
{
std::cout << "Type is C*" << std::endl;
//cannot dynamic_cast 'a' (of type 'struct A*') to type 'struct C*' (source type is not polymorphic)
}
}
#包括
结构A{};
结构B:A{};
结构C:A{};
C*C=新的C;
B*B=新的B;
A*A=新的A;
无效foo(A*A)
{
if(动态_-cast(a))
{
std::cout您需要通过添加至少一个虚拟函数来更改A
的定义。最简单的解决方案:添加虚拟析构函数:
struct A
{
virtual ~A() {}
};
然后:
输出:
Type is B*
Type is C*
请在此处尝试:
哦,我知道,这只是一个示例代码,但是这些用new
创建的全局函数看起来很糟糕。在a
中至少需要一个virtual
函数,最简单的方法是声明一个虚拟析构函数。@πάνταῥεῖ 为什么?虚拟函数如何帮助我在运行时确定类型?不明白……在这种情况下,编译器会创建一个vtable,这是动态\u cast
所必需的。实际上,因为编译器通过检查vtable指针来检查类型是否正确。或者,“因为标准这么说”.@St.Antario:如果需要标准引用,[class.virtual]将多态类定义为“声明或继承虚拟函数的类,[expr.dynamic.cast]指定(在大多数情况下)操作数或dynamic\u cast
“应为指向多态类型的指针或左值”.旁注:如果您拥有具有自己资源的派生类,则使用虚拟析构函数是一件好事。它可以确保在删除基类指针时正确销毁派生类。我确切地知道,虚拟析构函数的目的是什么,那么有什么意义呢?即使我们添加虚拟成员函数,我们也很可能将其声明为析构函数v不管怎么说,这是一种非常普遍的做法。
Type is B*
Type is C*