如何检查派生类中对象的类型名称?

yeg*_*256 0 c++

这是我的代码:

class Base { /* something */ };
class Derived : public Base { /* something */ };
vector<Base*> v; // somebody else initializes it, somewhere
int counter = 0; 
for (vector<Base*>::iterator i=v.begin(); i!=v.end(); ++i) {
  if (typeof(*i) == "Derived") { // this line is NOT correct
    counter++;
  }
}
cout << "Found " << counter << " derived classes";
Run Code Online (Sandbox Code Playgroud)

代码中的一行不正确.我该怎么写得好呢?提前谢谢了!

小智 5

使用dynamic_cast:

if ( dynamic_cast <Derived*>( *i) ) { 
    counter++;
Run Code Online (Sandbox Code Playgroud)

为此,您需要为您的基类提供至少一个虚函数 - 无论如何它确实需要一个虚拟析构函数.


Unc*_*ens 5

typeid实现定义的名称,您不应该对它们做出假设.但是,您可以比较两个typeid.

if typeid(**i) == typeid(Derived)
Run Code Online (Sandbox Code Playgroud)

通常它会被认为是一个糟糕的设计(但如果目的只是编写一个不太实用的程序来计算Derived的实例,那就没关系了).

请注意,这也需要基地有虚表(虚函数和/或析构函数),因为非多态类型只是没有动态类型的typeid检查(也就是说,它们都将是实例Base尽可能typeid关注) .

如果您没有任何虚拟功能,那么您需要自己模拟它.例如,如果您喜欢字符串比较并且不介意开销,请添加一个字段Base,每个类型将在其构造函数中填写并进行比较.否则为每个子类型使用唯一的整数标识符等.