The Design and Evolution of C++
3.5虚函数
3.5.1 对象布局模型
1.“把在一个类中定义的虚函数集合定义为一个指向函数的指针数组,这样,对一个虚函数的调用,也就变成了通过该数组而做的一些简单间接函数调用。对于每一个包含虚函数的类,都存在这样的一个数组,通常称为虚函数表或者vtbl。而这些类的每个对象都包含一个隐式指针,一般称为vprt,它指向该对象的类的虚函数表。”(p.66)
class A {
int a;
public:
virtual void f();
virtual void g(int);
virtual void h(double);
};
class B :public A {
public:
int b;
void g(int); //overrides A::g()
virtual void m(B*)
};
class C : public B {
public:
int c;
void h(double)j; //overrides A::h()
virtual void n(C*);
};
类C的一个对象看起来大概是这样:
3.8 常量
1.“在操作系统中,常常能见到人们用两个二进制位直接或间接地对一块存储区进行访问控制,其中用一个位指明某个用户能否在这里写,另一个指明该用户能否从这里读。我举得这种思想可以直接用到C++中,因此也考虑过允许把一个类型描述为readonly或者writeonly。”(p.78)
2.“直到现在,在C语言中还不能规定一个数据元素是只读的,也就是说,它的值必须保持不变。也没有任何办法去限制函数对传给它的参数的使用方式…readonly运算符可用于防止对某些位置的更新。它说明,对于所有访问这个位置的合法手段而言,只有那些不改变存储在这里的值的手段才是真正合法的。”(p.78)
3.“我在离开这次会议时得到的是同意(通过投票)把readonly引进C语言(而不是C with Classes 或者C++),但把它另外命名为了const。”(p.79)
4.“const来表示常数,可以成为宏的一种有用替代物,但要求全局const隐含地只在它所在的编译单元起作用。因为只有在这种情况下,编译器才能很容易推导出这些东西的值确实没有改变…把简单的const用到常量表达式中,并可以避免为这些常量分配空间。”(p.79)
[注释1]常量表达式中的值不必为其分配内存空间,与程序代码存储在一起。
5.“因为C语言中的const不能用在常量表达式中,这就使const在C语言中远没有在C++中那样有用。”(p.80)
3.11 次要特征
3.11.3 限定
1.“C++引进::表示类的成员关系,而将.保留专用于对象的成员关系,e.g. object.member,class::member。”(p.84)