Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在运行时检查类型?_C++_Casting - Fatal编程技术网

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*