书上有一段看的不是很明白,求大佬帮忙解释一下!
深度探索C++对象模型的 7.3执行期类型识别(Runtime Type Identification,RTTI)原文如下:
在cfront中,用来表现一个程序的内部类型体系,看起来像这样:
//程序层次结构的根类(root class)
class node{...};
class type : public node{...};
//两个函数陈述
class fct : public type{...};
class gen : public type{...};
其中第二个gen是generic的缩写,意思是通用的,用来表现一个重载函数。
然后只要我们有一个变量,或者是类型为type*的成员,并知道它代表一个函数,那么我们都必须决定其特定的派生类是fct或是gen。在cfront2.0之前,除了析构函数之外,唯一不能够被重载的是就是conversion转换运算符。例如:
class String{
public:
operator char*();
//...
}
在2.0导入常量成员函数之前,conversion运算符不能够重载,因为它们不使用参数。直到引进了=常量成员函数之后才可以,所以像下面的声明就有可能了:
class String{
public:
operator char*();
operator char*() const;
//...
}//cfront2.0或之后版本
也就是说,在cfront2.0版本之前,以一个explicit cast【显式转换】来存取派生对象总是安全快速的,比如下面:
typedef type *ptype;
typedef fct *pfct;
simplify_conv_op( ptype pt ){
//转换运算符可以作用于fct上面
pfct pf = (pfct)pt;
...
}
在常量成员函数引入之前,上面的代码是正确的,但在常量成员函数引入之后,上面的代码就不对了,这是因为String class声明的改变,因为char *conversion运算符现在被内部视为一个gen而不是fct。
我想知道这个conversion运算符和 pfct pf = (pfct)pt; 之间有什么关系?为什么说cfront2.0之后就不可以了?