1、通过运行时类型识别(RTTI),程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类型。
1)typeid操作符,返回指针或引用所指对象的实际类型。
2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。
2、dynamic_cast操作的形式如下:
dynamic_cast< Type& >(val)
Type是转换的目标类型,而val是基类类型的对象。
3、typeid表达式形如:
typeid(e)
e是任意表达式或者是类型名
只有当typeid的操作数是带虚函数的类类型的对象的时候,才返回动态类型信息。如果操作数不是类类型或者是没有虚函数的类,则typeid操作符指出操作数的静态类型。
4、类成员的指针:
如:class Screen{
public:
typedef std::string::size_type index;
char get() const;
char get(index ht,index wd) const;
private:
std::string contents;
index cursor;
index height,width;
};
contents的完全类型是”Screen类的成员,其类型是std::string“,即指contents的指针的完全类型是”指向std::string类型的Screen类成员的指针“,这个类型可写为
string Screen::*
可以将指向Screen类的string成员的指针定义为
string Screen::*ps_Screen;
可以用contents的地址初始化ps_Screen:
string Screen::*ps_Screen = &Screen::contents;
定义成员函数的指针:
如:可引用不接受形参的get版本的Screen成员函数的指针具有如下类型:
char (Screen::*)() const
使用类成员的指针:
1)成员指针解引用操作符(.*)从对象或引用获取成员。
2)成员指针箭头操作符(->*)通过对象的指针获取成员。
如:char (Screen::*pmf) const = &Screen::get;
Screen myScreen;
char c1 = (myScreen.*pmf)();
Screen *pScreen = &myScreen;
char c2 = (pScreen->*pmf)();