虚函数和虚指针

简介: 问题: class a{protected:virtual void test(){coutvirtual void test1(){cout};问题1:sizeof(a)=4,这个4应该是个指针大小,代表虚指针,但是如果这样的话是不是应该有两个指针呢??  问题2:还有一个地方是...
问题:
class a
{
protected:
virtual void test(){coutvirtual void test1(){cout};
问题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》


目录
相关文章
|
5月前
|
编译器 C++
纯虚函数和虚函数
纯虚函数和虚函数
26 0
|
C++
38.【C++ 虚函数 纯虚函数 虚基类 (最全详解)】(一)
38.【C++ 虚函数 纯虚函数 虚基类 (最全详解)】
47 0
|
C++
38.【C++ 虚函数 纯虚函数 虚基类 (最全详解)】(二)
38.【C++ 虚函数 纯虚函数 虚基类 (最全详解)】
97 0
|
2月前
|
编译器 C++ 索引
C++虚拟成员-虚函数
C++虚拟成员-虚函数
|
5月前
|
C++ 编译器 存储
|
5月前
|
编译器 C++
C++的虚函数
C++的虚函数
32 0
|
5月前
|
设计模式 安全 C++
c++ 虚函数小结
c++ 虚函数小结
|
5月前
|
存储 Unix 编译器
C++中虚函数和纯虚函数的问题总结
C++中虚函数和纯虚函数的问题总结
89 0
|
12月前
|
存储 编译器 C++
对C++中的虚函数的说明
对C++中的虚函数的说明
29 0
|
存储 C++
C++ 虚函数,虚函数表
C++ 虚函数,虚函数表