|
- 基础知识:
- 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;
- }
复制代码 |
|