• 谈谈c++中继承中的虚函数


     

                                                     c++继承中的虚函数

     

    c++是一种面向对象的编程语言的一个很明显的体现就是对继承机制的支持,c++中继承分很多种,按不同的分类有不同分类方法,比如可以按照基类的个数分为多继承和单继承,可以按照访问权限分为public继承、protected继承和private继承,按照是否是虚拟继承可以分为virtual继承和non-virtual继承。当然这里的分类标准都是有重叠的部分,比如,non-virtual继承又可以分为单继承和多继承。这里要讨论的是虚函数,因此主要从virtual和non-virtual继承两个方面来展开讨论分析。

    1、non-virtual继承
    non-virtual继承又有两种情况单继承和多继承。来看一个例子:
     1 class base1
     2 {
     3 public:
     4  virtual void f(){}
     5   virtual void h(){}
     6 };
     7 class base2
     8 {
     9 public:
    10  virtual void g(){}
    11 };
    12 class derive1:public base1
    13 {
    14 public:
    15 virtual void f(){}
    16 virtual void f1(){}
    17 }
    18 class derive2:public base1,public base2
    19 {
    20 public:
    21  virtual void f(){}
    22  virtual void g(){}
    23  virtual void g1(){}
    24 };
    建立四个对象:
    base1 b1;
    base2 b2;
    derive1 d1;
    derive2 d2;
    学习c++的都知道里面的虚函数表,上面的继承体系中各个类的虚函数表如下:
    base1的虚函数表如下:
    vptr-->base1::f base1::h//vptr为指向类的虚函数表的指针,-->表示的意思是指向一个表,后面的内容是表中的内容
    base2的虚函数表如下:
    vptr-->base2::g //
    derive1的虚函数表如下:
    vptr-->derive1::f  base1::h derive1::f
    derive2的虚函数表如下:
    vptr1-->derive2::f base1::h derive2::g1 //base1
    vptr2-->derive2::g //base2
    在windows开发平台查看虚函数表如下:主机环境为 win7+vs2013(显示的不完全),在调试模式下:
     
    2、virtual继承
    虚继承是在多重继承中引入的一种技术,关于虚继承的分析讨论不是本文的重点,不了解的同学可以查看相关的c++书籍,下面要讲的是virtual中的虚函数。
     1 class base1
     2 {
     3 public:
     4  virtual void f(){}
     5 };
     6 class base2
     7 {
     8 public:
     9  virtual void g(){}
    10 };
    11 class derive1:virtual public base1
    12 {
    13 public:
    14 virtual void f(){}
    15 virtual void f1(){}
    16 }
    17 class derive2:virtual public base1,virtual public base2
    18 {
    19 public:
    20  virtual void f(){}
    21  virtual void g(){}
    22  virtual void g1(){}
    23 };
    View Code
    通过vs2013查看虚函数表如下:
     
    本文参考了知名技术博主左耳朵耗子在csdn上的博客,
     
    欢迎大家来讨论交流,欢迎转载,切勿用于商业用途,版权所有,转载必须注明出处。
  • 相关阅读:
    墙奸有感
    关于ubuntu里的fcitx
    Ubuntu 9.10 ati HD 3470 显卡驱动 搞定
    XP与Ubuntu双系统的问题
    invalid conversion from ‘__pthread_t*’ to ‘pid_t’
    Julian Day
    m的n次幂的求法
    Sublime Text 2
    在虚拟机Virtualbox安装Win8消费者版
    记一个循环的错误
  • 原文地址:https://www.cnblogs.com/wangyichao/p/3729724.html
Copyright © 2020-2023  润新知