C++多继承多态的实现

栏目: C · 发布时间: 7年前

内容简介:C++多继承多态的实现

如果一个类中存在虚函数,在声明类的对象时,编译器就会给该对象生成一个虚函数指针,该虚函数指针指向该类对应的虚函数表。

多态的实现是因为使用了一种动态绑定的机制,在编译期间不确定调用函数的地址,在调用虚函数的时候,去查询虚函数指针所指向的虚函数表。

派生类生成的对象中的虚函数指针指向的是派生类的虚函数表,因此无论是基类还是派生来调用,都是查询的是派生类的表,调用的是派生类的函数。

如果发生了多继承,多个基类中都有虚函数,那么该是怎样的呢?虚函数指针如何排列,多个基类的指针为什么能够同时指向派生类对象,同时发生多态?

请看下面这段程序

#include <stdio.h>
#include <iostream>
using namespace std;

class Base1{

    public:
    void fun()
    {
        printf("this is Base1 fun\n");
    }
    virtualvoid fun1()
    {
        printf("this is Base1 fun1\n");
    }
};

class Base2{
    public:
    void fun()
    {
        printf("this is Base2 fun\n");
    }
    virtualvoid fun2()
    {
        printf("this is Base2 fun1\n");
    }
};

class Derived : public Base1,public Base2{
    public:
    void fun()
    {
        printf("this is Derived fun\n");
    }
    void fun1()
    {
        printf("this is Derived fun1\n");
    }
    void fun2()
    {
        printf("this is Derived fun2\n");
    }
};

int main()
{
    Derived  *pd = new Derived();
    Base1 *p1 = (Base1 *)pd;
    Base2 *p2 = (Base2 *)pd;
    p1->fun();
    p2->fun();
    p1->fun1();
    p2->fun2();
    printf("Base1 p1:%x\n", p1);
    printf("Base2 p2:%x\n", p2);
    return 0;
}

运行结果如下

feng@mint ~/code/c++/cpp_muti_drived 
$ ./muti_derived 
this is Base1 fun
this is Base2 fun
this is Derived fun1
this is Derived fun2
Base1 p1:2097c20
Base2 p2:2097c28

Derived类分别继承了Base1和Base2,根据结果来看,均发生了多态。基类指针调用函数,调用的均是派生类的对象。

通过打印出了p1和p2的地址,发现他们相差了8个字节,就能明白了,在做类型转换的过程中,如果把地址传给第二个基类的指针的时候会自动把地址减去8,在64位系统下,刚好是一个指针的长度。因此p2指向的实际上是第二个虚函数指针的地址,这样,就能够实现多继承的多态了。

本文永久更新链接地址 http://www.linuxidc.com/Linux/2017-06/144706.htm


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

连线力

连线力

杨国斌 / 邓燕华 / 广西师范大学出版社 / 2013-9 / 39.00

《连线力》,最关切我们未来的“思想@网络.中国”丛书之一,互联网中国传媒参考书。 中国网民在行动。在中国的广大网民中,普遍存在着对正义的渴望和追求,对弱者和小人物的同情, 对贪官污吏的痛恶,对政府的失望, 对权贵的嘲讽,对沟通的渴望,甚至对革命的呼唤。这些因素有着共同的内在逻辑,即情感逻辑。在这个意义上,情感汹涌的网络事件,是整个中国社会情感结构的脉络。 1994年,中国开通了全功能的......一起来看看 《连线力》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码