admin 发表于 2024-5-2 22:33:44

desc() isKindOf() cast() isA() 区别和用法

基础知识:

a 正常情况下,基类指针调用基类成员(成员变量和成员函数);派生类指针调用派生类成员
b 公有派生时基类指针允许指向派生类对象,但只能调用派生类继承自基类的成员而不能访问扩展部分成员
c 以私有派生时,基类指针不允许指向派生类对象
d 派生类指针不允许指向基类对象

另:基类的指针可以强制转换为派生类指针,反之不可。

静态成员函数只能对类内静态数据成员访问,也允许调用另一个静态成员函数,但不能访问其它成员。
公有的和保护的静态成员可以被继承,此时基类对象和派生对象共享静态成员。

AcRxClass是ARX所有类的基类

//desc()isKindOf()cast() isA()定义

static AcRxClass *   desc();
inline boolisKindOf( const AcRxClass * aClass ) const;
virtual AcRxClass *isA() const;
static AcRxObject *cast( const AcRxObject * inPtr);

//下面看如下代码
AcDbEntity *pEnt = NULL;
AcDbObjectId ObjId = ObjId::kNull;
acdbOpenObject(pEnt,ObjId,AcDb::kForRead,Adesk::kFalse);
//判断是否为单行文本类型
if(pEnt->isKindOf(AcDbText::desc()))
{
    AcDbText *pText=AcDbText::cast(pEnt);//pEnt这时指的已经是AcDbText类
}

上面代友中用到了 desc() isKindOf() cast() 三个函数:
pEnt 是AcDbEntity类型的指针,AcDbEntity是AcDbText的父类,在acdbOpenObject函数中,它指向了它的某一个子类,按基础知识判断,是允许的。

isA()函数无传入参数,返回不是bool型,^采用^,虽然它的名字看起来有点象。其实它的功能和 desc()很像,只是它返回的值是 this所特指的类

//isA()的示例
AcDbEntity *pEnt = NULL;
AcDbObjectId ObjId = ObjId::kNull;
acdbOpenObject(pEnt,ObjId,AcDb::kForRead,Adesk::kFalse);
//判断实体,如果不是SPLine类型则返回
if(pEnt->isA() != AcDbSpline::desc())
{
    pEnt->close();
    return;
}
页: [1]
查看完整版本: desc() isKindOf() cast() isA() 区别和用法