nonstatic data member 被置于每个对象内,static data member被置于每个对象外。static 和 nonstatic function 也被置于每个对象外。
virtual function 的支持:
1)虚函数表
2)虚表指针。
X foobar()
{
X xx;
X *px = new X;
xx.foo();
px->foo();
delete px;
return xx;
}
多态情况,
虚函数在执行期之前无法决定调用哪一个。
指针类型会告诉编译器如何解释内存内容与大小。
class ZooAnimal
{
public:
ZooAnimal();
virtual ~ZooAnimal():
virtual void rotate();
protected:
int loc;
string name;
};
class Bear :public ZooAnimal
{
public:
Bear():
~Bear();
protected:
enum Dances{};
int cell_block;
};
Bear b;
ZooAnimal *pz = &b;
Bear *pb = &b;
pb涵盖的地址包含整个Bear对象,pz包含的地址只包含Bear对象中的ZooAnimal subobject。
下面是一个 run-time operation(成本高)
Bear *pb2 = dynamic_cast<Bear*>(pz)
dynamic_cast < type-id > (
expression )
如果type-id是类
指针类型,那么
expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
dynamic_cast运算符可以在执行期决定真正的类型。
当我们写:
pz->rotate();
时,pz所指的object类型可以决定rotate()所调用的实体。(具体请看内存模型四)
Bear b;
ZooAnimal za = b;//引起分割
za.rotate();
rotate()所调用的是ZooAnimal的实体。