i
vptr 指向虚函数表(Vtable), 虚函数表中存储的是该类中所有的 virtual function 的指针, 也就是说, 每个类只有一张虚函数表, 可以验证一下这件事
Animal a,...需要注意的一点是, 派生类的虚函数表和基类的结构是一致的, 其中析构函数和 eat() 是自己的, bark() 沿用了 Animal 的 (析构函数编译器自动制造一个)....对象没有发生任何的变化, 仅仅是让一个基类的指针指向了派生类的对象.
如果把派生类的对象赋值给基类的对象会发生什么?...Animal a;
Dog b;
a = b;
a.eat();
输出如下:
Animal::eat()
这叫做sliced off, 只有继承自基类的部分会被拷贝给 a, 其余的部分就被 “切掉了”...同时可以看到, 最后打印了一个奇怪的值, 因为 Dog 类中新增了一个成员变量 tail (可以看到尽管 tail 是private 也并非没有办法去访问甚至修改), 而在基类 Animal 中是不存在的