看了辣子鸡丁的东东, 写点东西, 算是思考了

第一篇:


/*
 * 结论:
 * 类对象的数据可以裁减(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).

 

如有不对, 请高手斧正.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值