深度探索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之后就不可以了?
uj5u.com熱心網友回復:
看過,后來忘記了…………uj5u.com熱心網友回復:
大哥,你幫忙回憶下撒~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/30919.html
標籤:C++ 語言
