1、通过
运行时类型识别(RTTI),程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类型。
通过下面两个操作符提供RTTI
① typeid操作符,返回指针或引用所指对象的实际类型
② dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用
这些操作符只为带有一个或多个虚函数的类返回动态类型信息,对于其他类型,返回静态(即编译时)类型的信息。
2、可以使用 dynamic_cast操作符将基类类型对象的引用或指针转换为同一继承层次中其他类型的引用或指针。与dynamic_cast一起使用的指针必须是有效的--它必须为0或者指向一个对象。
可以对值为0的指针应用dynamic_cast,这样做的结果是0。
3、 typeid操作符使程序能够问一个表达式:你是什么类型?typeid表达式形如:
typeid(e);
如果操作数不是类类型或者是没有虚函数的类,则typeid操作符指出操作数的静态类型;如果操作数是定义了至少一个虚函数的类类型,则在运行时计算类型。
typeid操作符的结果是名为type_info的标准库类型的对象引用,要使用type_info类,必须包含库头文件typeinfo。
typeid的操作数是表示对象的表达式---测试*bp,而不是bp
if(typeid(bp) == typeid(Derived)){ //test always fails: The type of bp is pointer to Base
...
}
只有当typeid的操作数是带虚函数的类类型的对象的时候,才返回动态类型信息。测试指针(相对于指针所指的对象)返回指针的静态的、编译时类型。
4、 type_info类
t1 == t2 ;
t1 != t2;
t.name();
t1.before(t2);
默认构造函数和复制构造函数以及赋值操作符都定义为private,所以不能定义或复制type_info类型的对象。程序中创建type_info对象的
唯一方法是使用typeid操作符。
5、 类成员指针
成员指针只应用于类的非static成员。static类成员不是任何对象的组成部分,所以不需要特殊语法来指向static成员,static成员指针是普通指针。
① 定义数据成员的指针 例: string Screen::* p = &Screen::contents;
② 定义成员函数的指针,必须在以下三个方面与它所指函数的类型相匹配。
函数形参的类型和数目,包括成员是否为const
返回类型
所属类的类型
例: char (Screen::*pmf)() const = &Screen::get;
调用操作符的优先级高于成员指针操作符,因此,包围Screen::*的括号是必要的,没有这个括号,编译器就将下面代码当作(无效的)函数声明。 char Screen::*p() const;
6、 使用类成员的指针
① 成员指针解引用操作符(.*)从对象或引用获取成员
② 成员指针箭头操作符(->*)通过对象的指针获取成员
char (Screen::*pmf)() const = &Screen::get;
Screen myScreen;
char c1 = myScreen.get();
char c2 = (myScreen.*pmf)();
Screen *pScreen = &myScreen;
c1 = pScreen->get();
c2 = (pScreen->*pmf)();
① typeid操作符,返回指针或引用所指对象的实际类型
② dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用
2、可以使用 dynamic_cast操作符将基类类型对象的引用或指针转换为同一继承层次中其他类型的引用或指针。与dynamic_cast一起使用的指针必须是有效的--它必须为0或者指向一个对象。
3、 typeid操作符使程序能够问一个表达式:你是什么类型?typeid表达式形如:
4、 type_info类
5、 类成员指针
① 定义数据成员的指针
② 定义成员函数的指针,必须在以下三个方面与它所指函数的类型相匹配。
例: char (Screen::*pmf)() const = &Screen::get;
调用操作符的优先级高于成员指针操作符,因此,包围Screen::*的括号是必要的,没有这个括号,编译器就将下面代码当作(无效的)函数声明。
6、 使用类成员的指针
① 成员指针解引用操作符(.*)从对象或引用获取成员
② 成员指针箭头操作符(->*)通过对象的指针获取成员