“最晚辈派生”类和虚基初始化

2024-04-20 06:08
文章标签 初始化 派生 虚基 晚辈

本文主要是介绍“最晚辈派生”类和虚基初始化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果虚基类存在一个构造函数, 虚基类的使用并不是很简单。
为了便于理解,引入一个新术语:最晚辈派生类(most-derived)。

见下面代码:

#include < iostream >
using   namespace  std;

class   base
{
protected:
    
int a;
public:
    
base(int aa)           // constructor
    {
        a
=aa;
    }

}
;

class  derivedA:  virtual   public   base
{
protected:
    
int b;
public:
    derivedA(
int aa, int bb):base(aa)  // constructor
    {
        b
=bb;
    }

    
void show()
    
{
        cout
<<a<<endl;
        cout
<<b<<endl;
    }

}
;

class  derivedB:  virtual   public   base
{
protected:
    
int c;
public:
    derivedB(
int aa, int cc):base(13)   // constructor
    {
        c
=cc;
    }

    
void show()
    
{
        cout
<<a<<endl;
        cout
<<c<<endl;
    }


}
;

class  AB: public  derivedA,  public  derivedB
{

public:
    AB(
int aa, int bb, int cc) : derivedA(aa, bb), derivedB(aa, cc), base(33{}  // constructor
   
    
void show()
    
{
        cout
<<a<<endl;
        cout
<<b<<endl;
        cout
<<c<<endl;   
    }

}
;

int  main()
{
    derivedA aa(
12);
    aa.show();  cout
<<endl;

    derivedB bb(
34);
    bb.show();  cout
<<endl;
   
    AB ab(
567);
    ab.show();

    
return 0;
}


输出
1
2

13
4

33
6
7

最晚辈派生类是当前所在的类,当考虑构造函数时它尤其重要。
在前面的例子中,基构造函数里的最晚辈派生类是base;
在derivedA构造函数中,derivedA是最晚辈派生类;
在AB构造函数中, AB是最晚辈派生类。
打算使用一个虚基类时,最晚辈派生类的构造函数的职责是对虚基类进行初始化。
这意味着该类不管离虚基类多远,都有责任对虚基类进行初始化。

参考:  《Thinking in C++》
width="728" scrolling="no" height="90" frameborder="0" align="middle" src="http://download1.csdn.net/down3/20070601/01184120111.htm" marginheight="0" marginwidth="0">

这篇关于“最晚辈派生”类和虚基初始化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/919467

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

@postconstruct初始化的操作

从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion);@PostConstruct和@PreDestroy。这两个注解被用来修饰一个非静态的void()方法 。写法有如下两种方式: @PostConstruct Public void someMethod() {}

spring和tomcat初始化的类和注解

1.InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法。 spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用 实

LabVIEW环境中等待FPGA模块初始化完成

这个程序使用的是LabVIEW环境中的FPGA模块和I/O模块初始化功能,主要实现等待FAM(Field-Programmable Gate Array Module,FPGA模块)的初始化完成,并处理初始化过程中的错误。让我们逐步分析各部分的功能: 1. Wait for FAM Initialization框架 此程序框架用于等待I/O模块成功初始化。如果在5秒钟内模块没有完成配

dp(背包问题) 恰好、至少、至多初始化

状态表示的初始化(一般情况) f[i][j] i:前i件物品 体积至少为j 枚举体积时可以是负数(体积为负数时等价于体积为0) max f[i][j] = {-0x3f} f[i][0] = 0min f[i][j] = { 0x3f} f[i][0] = 0cnt f[0][0] = 1 体积至多为j 枚举体积时不能是负数 max f[i][j] = 0min f[i][j]

Windows11上使用WSL2,提示:系统尚未使用systemd作为初始化系统(PID 1)启动

前言 略 报错信息 System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down 解决方法 使用如下命令 # windows终端,执行如下命令wsl --update# 登录ubuntu系统,执行如下命令s

泛型第二课,派生子类、属性类型、方法重写、泛型擦除

子类(实现类) 子类与父类|接口一样使用泛型子类指定具体的类型子类与父类|接口 同时擦除类型子类泛型,父类|接口 擦除错误:不能子类擦除,父类|接口泛型 package com.pkushutong.genericity3;/*** 父类为泛型类* 1、属性* 2、方法* * 要么同时擦除,要么子类大于等于父类的类型* 不能子类擦除,父类泛型* 1、属性类型* 父类中,随父类型定

WapApp初始化样式表

@charset "utf-8";/* 样式初始化--------------------------------------------------*/body {margin: 0;padding: 0;background-color: #f6f6f6;font: normal 67.5% Helvetica, Arial, sans-serif;min-width: 240px;}*

Spark Core源码精读计划7 | Spark执行环境的初始化

推荐阅读 《Spark源码精度计划 | SparkConf》 《Spark Core源码精读计划 | SparkContext组件初始化》 《Spark Core源码精读计划3 | SparkContext辅助属性及后初始化》 《Spark Core源码精读计划4 | SparkContext提供的其他功能》 《Spark Core源码精读计划5 | 事件总线及ListenerBus》 《Spa