假设我有一个Animal类,能够告诉指针指向Animal对象会很好。我知道在C ++ RTTI和动态转换(我认为它们是相同的东西?)用于找出引用或指针的类型。但它只能通过多态继承来实现。因此,如果我希望课程能够告诉我它是什么类型,我必须声明:
virtual void dummyfunc(){}
动态转换和RTTI可以正常工作。 但我不能举例说明一个无效指针指向某个东西,并且能够告诉它指向的是什么类型。例如:
Animal dog;
Animal* animalPtr = &dog;
typeid(*animalPtr).name(); // RTTI works fine
dynamic_cast<Animal*>(animalPtr); // Dynamic cast tells me if it's an Animal. Well technically the compiler knows at compile time, but just as example.
void* voidPtr = &dog;
typeid(*voidPtr).name(); // Error, typeid expression must be a complete type
dynamic_cast<Animal*>(voidPtr); // Error, same thing
我有点理解为什么语言不允许我从void指针中做到这一点。
我知道如何创建一个类的最简单方法告诉我它是什么类型只是包含一个虚拟虚函数。它只是我或这似乎是一个hacky方式来做到这一点?例如,我已经考虑过一个带有虚函数的struct Dummy {}只是为了它的地狱,并让我的程序中的每个对象继承。然后对对象的任何引用都将是对Dummy类的引用,我将能够准确地告诉对象是什么类型。例如:
Dummy* listOfGodKnowsWhat[1000]; // Assign them to anything
// Loop through, if typeid matches what I want, do the right thing
我认为这非常灵活,但我想如果我想要一个完全动态的系统,那么我不应该使用C ++。这是能够告诉类型的最简单方法,只需添加一个虚函数吗?这是什么反映?当每个对象都知道它是什么类型时?
编辑:感谢后期开发人员提到我只需要一个虚拟析构函数,不需要任何虚拟的东西。