现在的位置: 首页 > 综合 > 正文

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

2012年12月22日 ⁄ 综合 ⁄ 共 1125字 ⁄ 字号 评论关闭

第一篇:

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

 

如有不对, 请高手斧正.

抱歉!评论已关闭.