C++虚基类的初始化
#include<iostream>
using namespace std;
class Base{
public:
Base(int sa)
{
a=sa;
cout<<"Constructing Base"<<endl;
}
private://私有变量,不可在派生类中直接使用
int a;
};
class Base1:virtual public Base{
public:
Base1(int sa,int sb):Base (sa)
{
b=sb;
cout<<"Constructing Base1"<<endl;
}
private:
int b;
};
class Base2:virtual public Base{
public:
Base2(int sa,int sc):Base(sa)
{
c=sc;
cout<<"Constructing Base2"<<endl;
}
private:
int c;
};
class Derived:public Base1,public Base2{
public:
Derived(int sa,int sb,int sc,int sd)
:Base(sa),Base1(sa,sb),Base2(sa,sc)
//如果Base类不是虚基类,就不能使用这种方式调用基类的构造函数
{
d=sd;
cout<<"Constructing Derived"<<endl;
}
private:
int d;
};
int main()
{
Derived obj(,,,);
return ;
} /*
执行结果
Constructing Base
Constructing Base1
Constructing Base2
Constructing Derived
*/
从分析上述程序中虚基类Base的构造函数只执行了一次。
显然,当Derived的构造调用了虚基类Base的构造函数之后,
类Base1和类Base2对Base构造函数的调用被忽略了,这也是初始化虚基类
和初始化非虚基类不同的地方。
关键字virtual与派生方式关键字(public或private)的先后顺序无关紧要,
他只说明是“虚拟派生”。
一个基类在作为某些派生类虚基类的同时,又作为另一些派生类的非虚基类,
这种情况是允许的。
C++虚基类的初始化的更多相关文章
- C++:虚基类
4.4.3 虚基类1.没什么要引入虚基类 如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多分同名成员.在访问这些同名的成员时,必须在 ...
- C++ (P160—)多继承 二义性 虚基类 “向上转型”
1 多继承中,必须给每个基类指定一种派生类型,如果缺省,相应的基类则取私有派生类型,而不是和前一个基类取相同的派生类型 2 一个类的保护成员只能被本类的成员函数或者它的派生类成员函数访问 3 由于c+ ...
- C++虚基类详解(转)
我们知道,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避 ...
- C++学习之路—继承与派生(三):多重继承与虚基类
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多重继承是指一个派生类有两个或多个基类.例如,有 ...
- C++ 多继承与虚基类
转载来自:CSDN insistGoGo (http://blog.csdn.net/insistgogo) 多继承的定义:派生类的基类大于一个 语法: class 派生类名:继承方式1 基类名1 ...
- c++ 虚基类应用
多重继承存在二义性,为了消除二义性在访问相同名称的属性时需要加上类名,加以区分.虽然这样可以解决二义性,但是相同的属性出现在多个基类中,为了解决数据冗余,c++引入了虚基类. 虚基类定义:class ...
- C++ 虚基类的定义、功能、规定
原文声明:http://blog.sina.com.cn/s/blog_93b45b0f01011pkz.html 虚继承和虚基类的定义是非常的简单的,同时也是非常容易判断一个继承是否是虚继承的,虽然 ...
- c++之虚基类初始化
C++虚基类构造函数下面文章详细介绍C++虚基,所谓C++虚基类:是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的,但前提是要深入理解到底什么是C++虚基类,及他是怎么运行的. 前面讲过,为 ...
- 【C++】继承(虚基类)
类的继承与派生 面向对象技术强调软件的可重用性,这种重用性通过继承机制来实现.而在类的继承过程中,被重用的原有类称为基类,新创建的类称为派生类.派生类定义语法格式如下: class <派生类名& ...
随机推荐
- java对json文件的操作
第一步:通过FileReader读取json文件第二步:使用BufferReader,先通过I/O读取一定大小的数据缓存到数组中,然后再从数组取出数据.第三步:用一个字符串把每次传来的数据处理后写到新 ...
- Wordcount -- MapReduce example -- Reducer
Reducer receives (key, values) pairs and aggregate values to a desired format, then write produced ( ...
- CPU设计学习-流水线
各种名词 标量流水线 超级流水线 超标量流水线与多发射技术 经典五级流水线 IF |Instruction Fetch,取指 ID |Instruction Decode,译码 EX |Execute ...
- CMD Markdown basic & Math Cheatsheet
CMD Markdown basic & Math Cheatsheet I am using CMD Markdown both at work and for study.You can ...
- POJ 3525/UVA 1396 Most Distant Point from the Sea(二分+半平面交)
Description The main land of Japan called Honshu is an island surrounded by the sea. In such an isla ...
- 从电梯问题,看c和c++之间的区别(有点懂了)错觉错觉
磕磕碰碰的也相继用c和c++构造了不少的电梯了.虽然对自我的表现不满意,但是总体来说还是有一定的收获的,对于c和c++之间的区别感觉也摸到了一点点门道了... 用c语言构造电梯的步骤: 第一步: 分析 ...
- Where to go from here
Did you get through all of that content? Congratulations! You've learnt the fundamentals of algorith ...
- Js键盘事件全面控制,回车按键事件,键盘对应按键码,按键事件兼容各个浏览器。
在网上查询的按键码如下: 一.键盘按键和键盘对应代码表: 字母按键码A <--------> 65 B <--------> 66 C <--------> 6 ...
- mysql8基本配置,差点被各种坑蒙圈
1. 下载免安装版mysql地址 https://dev.mysql.com/downloads/mysql/ 2. 基本配置 (1)解压zip包,将bin目录添加到环境变量 (2)在mysql根目录 ...
- Jenkins系列-Jenkins添加git密钥对
添加密钥 1.添加git用户和git密码对 ,用于git客户端从gitlab上拉取代码到本地