zoukankan      html  css  js  c++  java
  • 虚基类初始化问题

    在包含有继承关系的类里,生成一个派生类对象,要调用构造函数进行初始化此对象,而构造函数的调用顺序是先调用最顶层基类的构造函数,次顶层....等;但在普通继承和虚继承里存在区别

    • 普通继承:父类只能由其直接派生类初始化

     1 class A
     2 {
     3     char a;
     4 public:
     5     A(char _a) :a(_a){ cout << a << endl; }
     6 };
     7 
     8 class B:public A
     9 {
    10     char b;
    11 public:
    12     B(char _a, char _b) :A(_a),b(_b){ cout << b << endl; }
    13 };
    14 
    15 class C:public A
    16 {
    17     char c;
    18 public:
    19     C(char _a,char _c) :A(_a),c(_c){ cout << c << endl; }
    20 };
    21 
    22 class D:public B,public C
    23 {
    24     char d;
    25 public://注意初始化列表,父类只能由其直接派生类初始化,若初始化列表是:A(_a),B(_b),C(_c),D(_d),则出错
    26     D(char _a,char _b,char _c,char _d):B(_a,_b),C(_a,_c),d(_d){ cout << d << endl; }
    27 };
    28 
    29 void main()
    30 {
    31     D d('A','B','C','D');
    32 }

    虚继承:

    基类只能由最底层的派生类初始化,而不是由直接基类初始化,因为虚继承是为了避免多重继承产生的,只能存在一个子对象,所以只能初始化一次,而在多继承里,一个基类可能存在多个直接派生类,为了避免直接派生类多次初始化基类,只能由最底层的派生类来初始化。

     1 class A
     2 {
     3     char a;
     4 public:
     5     A(char _a) :a(_a){ cout << a << endl; }
     6 };
     7 
     8 class B :virtual public A
     9 {
    10     char b;
    11 public:
    12     B(char _a, char _b) :A(_a), b(_b){ cout << b << endl; }
    13 };
    14 
    15 class C :virtual public A
    16 {
    17     char c;
    18 public:
    19     C(char _a, char _c) :A(_a), c(_c){ cout << c << endl; }
    20 };
    21 
    22 class D :public B, public C
    23 {
    24     char d;
    25 public://初始化列表里包含A(_a),表示虚基类由最底层派生类初始化
    26     D(char _a, char _b, char _c, char _d) :A(_a), B(_a,_b), C(_a,_c), d(_d){ cout << d << endl; }
    27 };
    28 void main()
    29 {
    30     D d('A','B','C','D');
    31 }

    这里说的最底层是指对象的层级

    如B b,则B是A的最底层派生类,由b负责初始化b中所包含的A的子对象

    D d,则D是A的最底层派生类,由d负责初始化A的子对象

  • 相关阅读:
    高阶篇:1.2)材料和工艺的选择
    高阶篇:4.1.1)QFDI(客户需求转换为设计要求)
    高阶篇:4)可靠性设计-总章
    高阶篇:1.5)如何选择更好的概念-Pugh矩阵法
    知识点篇:2)产品结构设计目标的分类
    高阶篇:1.1)竞品(标杆产品)的拆解和分析benchmarking
    支持向量机
    机器学习概述
    HDU_oj_2055 An easy problem
    HDU_oj_2054 A==B ?
  • 原文地址:https://www.cnblogs.com/mrlsx/p/5869818.html
Copyright © 2011-2022 走看看