Cplus3

cplus analysis about virtual function.

This project is maintained by wangfakang

关于c++虚函数的解析:

虚函数给予了c++很强大的特性[多态],那么虚函数在对象中的内存分布又是如何的恩?是如何做多动态的多态的恩? 下面会一一解答这些问题[个人所见,如有错误,欢迎拍砖].

看看如下代码:

using namespace std;
#include<iostream>


class A {
public:
   virtual void print() {
        cout<<"A"<<endl;
   }
private:
   //int a;
};


//class B : public virtual A {
class B : public  A {
public:
   virtual void print() {
        cout<<"B"<<endl;
   }
   virtual void printf() {
        cout<<"Bf"<<endl;
   }
private:

};


typedef void (*Pfun)();

int main()
{
    A a;
    B b;
    Pfun fun;
    int i = 0;

    for(; i < 2; i++)
    {
         fun = (Pfun) *((int*)*(int*)(&b)+i);
         fun();

    }
    return 0;

}

输出结果:

B
Bf

问题一之虚表指针存放与何处:

gdb调试看到如下:

(gdb) p a
$1 = {_vptr.A = 0x400c70 <vtable for A+16>}
(gdb) p b
$2 = warning: can't find linker symbol for virtual table for `B' value
warning:   found `B::B()' instead
{<A> = {_vptr.A = 0x400ba0 <__libc_csu_init>}, <No data fields>}

每个对象都有一个vptr指针---虚表指针(用来存放虚函数的地址).
注意:虚表指针位于一个对象的首的前四字节[32位系统].为啥要在放在对象首部恩? 原因很简单,便于后续的查询速度呗.

问题二之输出结果为啥是这样:

问题三之虚表指针何时共享与否:

问题四之多继承的时候子类的虚表是怎么样的:

当子类D多继承与类A B C的时候,其中ABC中都有虚函数:

Communite

在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

Thx

Author