第一篇:
/*
* 结论:
* 类对象的数据可以裁减(slice), 但是不影响类的虚表(virtual table)。
* 在类对象的数据区保存虚表的指针, 类对象的职责仅此而已。
*/
#include
using namespace std;
class A
{
public:
void print() {
cout<<"this is A."<
}
};
class B : public A
{
public:
void print() {
cout<<"this is B."<
}
};
class vA
{
public:
virtual void print() {
cout<<"this is A."<
}
};
class vB : public vA
{
public:
void print() {
cout<<"this is B."<
}
};
int main(void)
{
A _a;
B _b;
A* _pa = &_a; // 指向_a对象的一个指针.
// 指向_b对象的一个指针, 不过访问的数据大小为sizeof(A)
A* _pb = &_b;
vA _va;
vB _vb;
vA* _vpa = &_va;
// 指向_vb对象的一个指针, 不过访问的数据大小为sizeof(vA)
vA* _vpb = &_vb;
_pa->print();
_pb->print();
_vpa->print();
_vpb->print();
return 0;
}
第二篇:
#include
using namespace std;
class A{
public:
virtual void fun(){ cout<<"A::fun"<
virtual void fun2(){cout<<"A::fun2"<
};
class B:public A{
public:
void fun(){ cout<<"B::fun"<
void fun2(){ cout<<"B::fun2"<
};
int main(void)
{
void (A::*fun)(); //定义一个类 A 内的函数指针
A *p = new B;
// 返回的应该是一个 vtbl 中 slot 的索引值, 实际和 A,B 没有关系
fun = &A::fun; (p->*fun)(); // 编译器内部计算:p -> (vptr + index)();
/*
* note: 此时 p 指向一个类 A 型对象, 但是 vtbl 中是类 B 的函数指针.
* 还是上面的老话, 类对象(数据)只维护 vptr, 至于函数地址, 要运行
* 时根据 index 算出来。
*/
fun = &A::fun2;
(p->*fun)();
delete p;
return 0;
}
第三篇:
delete p; 编译器在内部状态中维护回收 sizeof(B) 大小, 而不是 sizeof(A).
如有不对, 请高手斧正.