c++模型笔记:
第一章:关于对象
1:c中数据和处理数据是分开声明的,c没有支持数据和函数之间的关联性,程序性的
2:c++中 data members直接内含在每一个class object 之中,就像c struct一样,而member function 虽然在object 之中,但每一个non-inline member function只会诞生一个函数实体,拥有inline member function 则会在其每一个使用者(模块)身上产生一个函数实体,
C++ 在布局和存取时间上的额外负担是由 virtual引起的,包括:
1)vitrual function 机制,用以支持一个有效率的执行器绑定(runtime blinding)(虚拟函数的功能是使子类可以用同名的函数对父类函数进行覆盖,并在调用时自动调用子类覆盖函数)
2)virtual base class 用以实现“多次出现在继承体系中的base class 有一个单一而被共享的实体”
1.1 c++ object model
1.2 a keyword distinction
1 struct实现了c中数据萃取的观念,而class关键词实现的是c++中ADT观念
1.3 an object distionction
1:c++以以下方法支持多态:
多态:在运行时,能依据其类型确认调用哪个函数的能力成为多态
1)经由一组隐含的转换操作,例如把一个derived class 指针转化成一个指向其public base type 的指针, shape *ps = new circle();
2)virtual function 机制
3)经由 dynamic_cast 和typeid 运算符: if(circle *pc = dynamic_cast<circle*>( ps))...
多态的主要用途是经由一个共同的接口来影响类型的封装,这个接口通常定义在一个抽象的base class 中
void rotate(
X datum,
const X *pointer,
const X &reference )
{
// cannot determine until run-time
// actual instance of rotate() invoked执行之前无法确定哪一个rotate()实体被调用
(*pointer).rotate();
reference.rotate();
// always invokes X::rotate()
datum.rotate();
}
main() {
Z z; // a subtype of X
rotate( z, &z, z );//指针和引用完成调用
return 0;
}
需要多少内存够表现一个class object
* 其nostatic data member 的大小
*填补的空间,32位机为4bytes的倍数
*为支持virtual而由内部产生的额外负担
the type of a pointer
*从内存需求上说,ZooAnimal *pl 和int *t 没有什么不同,”指针类型“会教导编译器如何解释某个特定地址中的内存内容及其大小
*void *指针只能够含有一个地址,而不能通过它操作所指之object ??
* 转型(cast) 其实是种编译指令,大部分情况下不影响一个指针所含的真正地址,它只影响”被指出之内存的大小和其内容“的解释方式
----------------------
注意:子类重新定义父类的虚函数的做法叫做覆盖,而不是重载,重载是在编译阶段就确定的了,是静态的,因此重载与多态无关