根据具体代码typeid
返回不同的东西。另外name()
可以返回任何东西(包括将第一个字母大写或删除 *),它仅用于调试。现在我有几个不同的可能答案typeid(animal).name()
可以返回。
版本 1animal
是一个类名:
struct animal {
virtual ~animal() {}
};
struct dog
: animal
{};
struct cat
: animal
{};
struct bird
: animal
{};
int main() {
std::cout << typeid(animal).name() << std::endl; // animal
return 0;
}
版本 2animal
是一个 typedef Animal
:
struct Animal {
};
struct Dog
: Animal
{};
struct Cat
: Animal
{};
struct Bird
: Animal
{};
int main() {
typedef Animal animal;
std::cout << typeid(animal).name() << std::endl; // Animal
return 0;
}
版本 3animal
是一个指针:
struct Animal {
};
struct Dog
: Animal
{};
struct Cat
: Animal
{};
struct Bird
: Animal
{};
int main() {
Dog d;
Animal* animal=&d;
std::cout << typeid(animal).name() << std::endl; // Animal*
return 0;
}
版本 4animal
是一个对象:
struct Animal {
};
struct Dog
: Animal
{};
struct Cat
: Animal
{};
struct Bird
: Animal
{};
int main() {
Animal animal;
std::cout << typeid(animal).name() << std::endl; // Animal
return 0;
}
版本 6animal
是对非多态对象的引用:
struct Animal {
};
struct Dog
: Animal
{};
struct Cat
: Animal
{};
struct Bird
: Animal
{};
int main() {
Dog d;
Animal& animal=d;
std::cout << typeid(animal).name() << std::endl; // Animal
return 0;
}
版本 7animal
是对多态对象的引用:
struct Animal {
~virtual Animal() {}
};
struct Dog
: Animal
{};
struct Cat
: Animal
{};
struct Bird
: Animal
{};
int main() {
Dog d;
Animal& animal=d;
std::cout << typeid(animal).name() << std::endl; //Dog
return 0;
}
正如其他人所写,最好不要依赖name()
. 但是如果没有一些代码,就很难说什么是正确的。