C++中如何判断一个对象是否属于某个类??

类似java的instanceof 的那个用法3Q
2024年11月29日 11:46
有5个网友回答
网友(1):

C++的类指的就是class, 而struct(结构体)union(联合)都是C语言里的。
在C++中, 用 "类" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物。那么类就可以看做是对相似事物的抽象, 找到这些不同事物间的共同点, 如自行车和摩托车, 首先他们都属于"对象", 并且具有一定得相同点, 和一些不同点, 相同点如他们都有质量、都有两个轮子, 都是属于交通工具等。"都有质量"、"两个轮子"属于这个对象的属性, 而"都能够当做交通工具"属于该对象具有的行为, 也称方法。

类是属于用户自定义的数据类型, 并且该类型的数据具有一定的行为能力, 也就是类中说描述的方法。通常来说, 一个类的定义包含两部分的内容, 一是该类的属性, 另一部分是它所拥有的方法。以 "人类" 这个类来说, 每个人都有自己的姓名、年龄、出生日期、体重等, 为 人类 的属性部分, 此外, 人能够吃饭、睡觉、行走、说话等属于人类所具有的行为。

上面举例中所描述的 "人" 类仅仅是具有人这种对象的最基础的一些属性和行为, 可以称之为人的"基类"。 再说说一些具有一些职业的人, 例如学生, 一个学生还具有"基类"中所没有的属性, 如学校、班级、学号; 也可以具有基类所不具有的行为, 如每天需要去上课, 需要考试等。

学生类可以看做是基类的一个扩展, 因为他具有基类的所有属性和行为, 并且在此基础上增加了一些基类所没有的属性和行为, 像"学生"这样的类称为"人类"这个基类的"派生类"或者"子类"。在学生的基础上海可以进一步的扩展出其他更高级的类, 如"研究生"类。

网友(2):

C++语言判断一个对象有两种机制

在运行时判断,使用if else
int i ;
if( typeid( i ) == typeid( int ) )
cout << "i is int" << endl ;
else
cout << "i is not int" << endl ;

在编译时判断,使用重载或者特化
template< class T >
void func( T t )
{
cout << "i is not int" << endl ;
}

template< >
void func( int i)
{
cout << "i is int" << endl ;
}

int i ;
func( i )

希望对你有用。

网友(3):

类代表了某一批对象的共性和特征。类是对象的抽象,对象是类的具体实例。和结构体类型和结构体变量一样,c++中也是先声明一个类类型,然后用它去定义若干个同类型的对象。对象就是类类型的一个变量。

class Student //声明了一个名为student的类类型
{
private:
int num;
public:
void display();
};
Student stud1,stud2; //定义了两个Student类的对象

事实上,类也是一种数据类型,它是一种广义的数据类型,过去接触的都是狭义的数据类型,如结构体类型的成员都是数据,而类这种数据类型的数据既包含数据也包含操作数据的函数。

网友(4):

判断 x 的动态类型是不是Y,可以用表达式:typeid(x) == typeid(Y)
这个要包含: 头文件
另外VC可能需要你开启RTTI之后才能用。

网友(5):

你仔细看看这个程序RTTI(运行时类信息机制)
#include 
#include 
#include 
using namespace std;
class A {
public:
virtual ~A (void) {}
};
class B : public A {};
void foo (A* pa) {
// if (! strcmp (typeid (*pa).name (), "1A"))
if (typeid (*pa) == typeid (A))
cout << "A对象" << endl;
else
// if (! strcmp (typeid (*pa).name (), "1B"))
if (typeid (*pa) == typeid (B))
cout << "B对象" << endl;
}
int main (void) {
cout << typeid (int).name () << endl;
cout << typeid (double*).name () << endl;
cout << typeid (char (*)[10]).name () << endl;
cout << typeid (char* [10]).name () << endl;
cout << typeid (char* (*) (int, short)).name () << endl;
cout << typeid (A).name () << endl;
A* pa = new B;
cout << typeid (pa).name () << endl;
cout << typeid (*pa).name () << endl;
foo (pa);
foo (new A);
return 0;
}