书上有一段看的不是很明白,求大佬帮忙解释一下!

uouo88 2020-07-04 09:14:39
深度探索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之后就不可以了?

...全文
194 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
uouo88 2020-07-07
  • 打赏
  • 举报
回复
引用 1 楼 ztenv 的回复:
看过,后来忘记了…………
大哥,你帮忙回忆下撒~
ztenv 版主 2020-07-06
  • 打赏
  • 举报
回复
看过,后来忘记了…………
GAOXIAOXUEXIZHE 2022-07-08
  • 举报
回复
@ztenv 大佬,我也不懂,能解释一下不

64,686

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧