C++ 有 typeid
关键字,可以在动态运行时得到一个类的类别。
我利用 static 变量尝试判断一个对象的类别
测试代码如下:
#include <bits/stdc++.h>
#define rep( i , j , n ) for ( int i = int(j) ; i < int(n) ; ++i )
#define dew( i , j , n ) for ( int i = int(n-1) ; i > int(j) ; --i )
#define _PATH __FILE__ , __LINE__
typedef std::pair < int , int > P ;
using std::cin ;
using std::cout ;
using std::endl ;
using std::string ;
enum class Type {
Object , Student , Teacher , Course
} ;
class Object {
public:
const static Type type = Type::Object ;
public:
static const char* get_type_name () {
return "Object" ;
}
} ;
class Student : public Object {
public:
const static Type type = Type::Student ;
public:
static const char* get_type_name () {
return "Student" ;
}
} ;
class Teacher : public Object {
public:
const static Type type = Type::Teacher ;
public:
static const char* get_type_name () {
return "Teacher" ;
}
} ;
class Course : public Object {
public:
const static Type type = Type::Course ;
public:
static const char* get_type_name () {
return "Course" ;
}
} ;
void Judge ( const Type type ) {
switch ( type ) {
case Type::Object : {
cout << "是一个 Object 类" << endl ;
break ;
}
case Type::Student : {
cout << "是一个 Student 类" << endl ;
break ;
}
case Type::Teacher : {
cout << "是一个 Teacher 类" << endl ;
break ;
}
case Type::Course : {
cout << "是一个 Course 类" << endl ;
break ;
}
}
}
int main () {
Object One ;
Judge ( One.type ) ;
Student Two ;
Judge ( Two.type ) ;
Teacher Three ;
Judge ( Three.type ) ;
Course Four ;
Judge ( Four.type ) ;
cout << "\nOne 类别的名字是 " << One.get_type_name () ;
cout << "\nTwo 类别的名字是 " << Two.get_type_name () ;
cout << "\nThree 类别的名字是 " << Three.get_type_name () ;
cout << "\nFour 类别的名字是 " << Four.get_type_name () ;
if ( One.type == Student::type )
cout << "\n\nOne 和类型 Student 匹配" ;
else
cout << "\n\nOne 和类型 Student 不匹配\n" ;
Teacher* Five = new Teacher ;
if ( Five->type == Teacher::type )
cout << "\nTeacher* Five 和类型 Teacher 匹配\n" ;
else
cout << "\nTeacher* Five 和类型 Teacher 不匹配\n" ;
Object* Six = new Teacher () ;
cout << "\nObject* Six.name = " << Six->get_type_name () << endl ;
if ( Six->type == Teacher::type )
cout << "\nObject* Six 和类型 Teacher 匹配\n" ;
else
cout << "\nObject* Six 和类型 Teacher 不匹配\n" ;
cout << "\nObject* Six.name = " << (*Six).get_type_name () << endl ;
// Object* Six-> 和 (*Six). 都只能取到 Object 的部分
if ( (*Six).type == Teacher::type )
cout << "\nObject Six 和类型 Teacher 匹配\n" ;
else
cout << "\nObject Six 和类型 Teacher 不匹配\n" ;
return 0 ;
}