zoukankan      html  css  js  c++  java
  • c++虚继承

    在多重继承中,如果发生了如:类B继承类A,类C继承类A,类D同时继承了类B和类C。最终在类D中就有了两份类A的成员,这在程序中是不能容忍的。当然解决这个问题的方法就是利用虚继承。

     1 class A{
     2 public:
     3     int t;
     4     A(int a)
     5     {
     6         t = a;
     7     }
     8     void fun();
     9 };
    10 
    11 class B:virtual public A
    12 {
    13 public:
    14     B(int a, int b) :A(a+10)
    15     {
    16         t1 = b;
    17     }
    18     ~B();
    19     int t1;
    20 };
    21 
    22 class C :virtual public A
    23 {
    24 public:
    25     C(int a,int c):A(a+20)
    26     {
    27         t2 = c;
    28     }
    29     ~C();
    30     int t2;
    31 };
    32 
    33 class D :public B,public C
    34 {
    35 public:
    36     D(int a,int b,int c,int d) :B(a,b),C(a,c),A(a){}//在此必须要给虚基类传参
    37     ~D();
    38 };

     在派生时将关键字virtual加在相应相应继承方式前,就可防止在D类中同时出现两份A类成员。

    在实例化D时我们给a传入一个1,那么在虚基类中的t为何值呢?(注意我们在第14,25行给虚基类的构造函数传值时都进行了“+”操作。)

    而答案是肯定的必然为1,因为在实例化D的时候,只会调用一次虚基类的构造函数,使得虚基类接收到参数也只可能是从实例化D时传过来的参数。

    int mian()
    {
        D temp(1,2,3,4);
        return 0;
    }

    注意:C++编译系统在实例化D类时,只会将虚基类的构造函数调用一次,忽略虚基类的其他派生类(class B,class C)对虚继承的构造函数的调用,从而保证了虚基类的数据成员不会被多次初始化。

  • 相关阅读:
    window 配置 sendmail
    无限级分类
    sublime
    php笔记
    Python:开发_基本流程
    python学习笔记,视频day13-python基础知识练习题(二)
    python学习笔记,视频day12-列表、元组、字典+整理
    java学习笔记- Math类、String类
    java学习笔记-if语句、Switch语句
    java学习笔记-循环
  • 原文地址:https://www.cnblogs.com/lovemee/p/10533324.html
Copyright © 2011-2022 走看看