25.虚函数底层实现机制

C++在基类中声明一个带关键之Virtual的函数,这个函数叫虚函数;它可以在该基类的派生类中被重新定义并被赋予另外一种处理功能。通过指向指向派生类的基类指针或引用调用虚函数,编译器可以根据指向对象的类型在运行时决定调用的目标函数。这就实现了多态。

2、实例

 

#include<iostream>

using namespace std;

 

class Base

{

public:

virtual void fun1 () {cout<<" printf base fun1!"<<endl;}

virtual void fun2 () {cout<<" printf base fun2!"<<endl;}

private:

int m_data1;

} ;

 

class Derive: public Base

{

public:

void fun1 () {cout<<" printf derive fun1!"<<endl;}

void fun3 () {cout<<" printf derive fun3"<<endl;}

private:

int m_data2;

} ;

 

int main ()

{

Base *pBase=new Derive;//指向Derive的Base 类指针

Derive a;

pBase->fun1 () ;

pBase->fun2 () ;

a.fun3 () ;

return 0;

}

虚函数基实就是改写子类

 

3、底层机制

在每一个含有虚函数的类对象中,都含有一个VPTR,指向虚函数表。

 

 

 

 

派生类也会继承基类的虚函数,如果在派生类中改写虚函数,虚函数表就会受到影响;表中元素所指向的地址不是基类的地址,而是派生类的函数地址。

 

 

 

 

 

当执行语句pBase->fun1()时,由于PBase指向的是派生类对象,于是就调用的Deriver::fun1()。

 

 

 

4、多重继承

 

#include<iostream_h>

class base1

{

public:

virtual void vn(){}

private:

inti;

);

class base2

{

public:

virtual void vf2(){}

private:

intj;

);

class derived:public base 1,public base2

{

public:

virtual void vf3(){}

private:

int k:

);

void main()

{

derivedd:

base1 pl;

base2 p2;

pl=&d;p2 &d:

pl->vfl();

p2->vf2();

}

 

 

 

如果一个类具有多个包含虚函数的父类,编译器会为它创建多个VIrtual table,每个virtual table中各个虚函数的顺序与相应的父类一样

 

多重继承产生多个虚表

 

posted @ 2020-06-27 20:16  janeyjhon1  阅读(212)  评论(0编辑  收藏  举报