1

例如,我定义了一个这样的 C++ 类:

class cat : public animal
{
  public:
    cat(const char* nameString) : m_name(nameString) {}
    ~cat(){}
    const char* getName() {return m_name.c_str();}

 private:
    std::string m_name;
};

之后:

cat kitty("Garfield");
printf("%s", kitty.getName());

对于上面的示例代码,ctags可以告诉我继承、成员、方法、访问类型(公共、私有)等。

但是我怎样才能知道 kitty 是 cat 的一个实例呢?

4

3 回答 3

1
std::cout << "kitty is a: " << typeid(kitty).name() << '\n';

但是,如您所见,可能并不完全是您想要的。

返回包含类型名称的实现定义的以空字符结尾的字符串。不提供任何保证,特别是,返回的字符串对于多种类型可以是相同的,并且在同一程序的调用之间会发生变化。

您可以typeid其他已知类型进行比较,例如cat.

您可以按照与对象名称相同的方向/样式进行制作,并在以下内容中包含一个虚函数Animal

virtual string whatAnimal()const{return "animal";}

在派生类中:

string whatAnimal()const override {return "cat";}

现在您可以完全控制每种类型的字符串,与您在代码中使用的名称约定无关。

于 2013-02-20T18:32:54.717 回答
0

可以使用 typeid 获取对象的类名。但是,编译器会修改名称,因此您应该在运行时适当地对其进行解组。

一个例子:

#include <iostream>
#include <cxxabi.h>

class cls {};

void main(){
    cls obj;
    int status;
    char * demangled_name = abi::__cxa_demangle(typeid(obj).name(),0,0,&status);
    std::cout << demangled_name << std::endl;
    free(demangled_name);
    return;
}

将输出:

   cls
于 2013-02-20T18:35:28.883 回答
0

可以通过以下方式直接回答您如何检查 kitty 是否为 cat 实例的问题:

if(typeid(cat) == typeid(kitty))
    // do something if kitty is a cat

注意,typeid(YourClass).name()返回nYourClass,其中 n 是类名的长度。

于 2013-02-20T20:25:38.797 回答