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

基础知识:

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

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

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

AcRxClass是ARX所有类的基类

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

static AcRxClass *   desc();
inline bool  isKindOf( 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;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值