Chinaunix首页 | 论坛 | 博客
  • 博客访问: 621538
  • 博文数量: 363
  • 博客积分: 110
  • 博客等级: 民兵
  • 技术积分: 1347
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-22 16:07
文章分类

全部博文(363)

文章存档

2018年(83)

2016年(1)

2014年(2)

2013年(34)

2012年(236)

2011年(7)

分类:

2013-06-27 13:33:28

原文地址:虚函数和虚指针 作者:zishang-hhg

问题:
class a
{
protected:
virtual void test(){cout<<"aaa"<virtual void test1(){cout<<"df"<};
问题1:
sizeof(a)=4,这个4应该是个指针大小,代表虚指针,但是如果这样的话是不是应该有两个指针呢?? 
问题2:
还有一个地方是 a aa; sizeof(aa)=4,那么到底是虚指针是存在类里面还是类的对象里面呢?? 
问题3:
虚指针是个函数指针,指向虚函数表里面的位置,那么虚函数表是存在哪里的呢??大小又是多少呢???从上面两个例子好像看不到明确的答案,似乎类和对象都没存放
解:
问题1: 
sizeof(a)=4,这个4应该是个指针大小,代表虚指针,但是如果这样的话是不是应该有两个指针呢?? 
的确是个指针的大小,但是并不是指针虚函数,而是指向虚表,虚表里存放的才是虚函数的指针.

问题2: 
还有一个地方是 a aa; sizeof(aa)=4,那么到底是虚指针是存在类里面还是类的对象里面呢?? 
类不是一个可以存贮东西的地方,类的概念只存在于编译期间,因为只能存放在对象里.

问题3: 
虚指针是个函数指针,指向虚函数表里面的位置,那么虚函数表是存在哪里的呢??大小又是多少呢???从上面两个例子好像看不到明确的答案,似乎类和对象都没存放 
虚表是整个类共用的,他的大小取决于你定义的虚函数的个数,以及编译器的策略.一般存在于内存的某个地方,你不需要去管他.
 
//用C来实现C++虚表机制
//理论可以用函数指针和结构体的语言都可以实现

//-------------------------------C++的对象构建,确定虚表结构-------------------------------
class IDispath
{
public:
   
virtual  void __stdcall Find() = 0;
   
virtual  void __stdcall Invoke(int x) = 0;
};

class ITest :public IDispath
{
public:
   
virtual  void __stdcall Use() = 0;
};
class CTest :public ITest
{
public:
   
void  __stdcall Find()
    {
        printf(
"Find\n");
    };
   
void  __stdcall Invoke(int x)
    {   
        printf(
"Invoke(%d)\n",x);
    };
   
void __stdcall Use()
    {
        printf(
"use\n");
    };
};
//-------------------------------C 部分构造和C++对象相同的虚表结构-------------------------------
typedef struct STest STest;
struct vtpr//虚表内容
{
   
void (__stdcall *Find)( STest* This);//虚表所对应的函数指针 第一个参数为对象的this指针
    void (__stdcall *Invoke)( STest* This,int x);
   
void (__stdcall *Use)( STest* This);
};
struct STest
{
   
struct vtpr * p;//虚表指针
};


int main(int argc, char* argv[])
{
    CTest
* t =new CTest;

   
//利用C构建的虚表进行函数调用
    STest* pTest = (STest*)t;
    pTest
->p->Find(pTest);
    pTest
->p->Invoke(pTest,23);
    pTest
->p->Use(pTest);

    delete t;
   
return 0;
}

 

《inside the c++ object model》


阅读(862) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~