1.   C++继承与java不同,java遵循单继承,但java的接口为其不足做了很好的弥补了。 C++则是灵活的多,为多继承。即一个C++类可以同时继承N个类的属性。

2. 对于继承方式 :

有三种:  public ,private,protect,对于public继承的类,其公有成员依然是公有成员,私有成员依旧是私有成员。

对于protect,private 则有限制 ,就好比一个水管,公有水管是最大号的,对于水的流量没有限制。保护水管,是中等的号的,对于大号水管的流量使其变成中等流量,对于中等以下的不限制。私有水管,则是最小号的,对于大于私有水管限制的统统的改为私有水管的标准。 其中私有继承,其实就是一种绝育的措施。就是以后的继承就没有太大意义。

3.对于继承关于构造和析构顺序原里的归纳:

看代码:

 #include<iostream>
using namespace std ; class Base1 { public :
Base1() {
cout << "Default Base1" << endl;
}
Base1(int i) {
cout << "Base1"<<i<< endl;
}
~Base1() {
cout << "Base1 析构" << endl;
}
}; class Base2 { public :
Base2() {
cout << "Default Base2" << endl;
}
~Base2() {
cout << "Base2 析构" << endl;
}
Base2(int i) {
cout << "Base2" << i << endl;
}
};
class Base3 { public :
Base3() {
cout << "Default Base3" << endl;
}
~Base3() {
cout << "Base3 析构" << endl;
}
Base3(int i) {
cout << "Base3" << i << endl;
} }; class Derived : public Base1, public Base2, public Base3 //(1)先 在这儿开始构造从左到右
//析构则是从右到左
{ public :
Derived() {
cout << "Default Derived" << endl;
}
~Derived() {
cout << "Derived 析构" << endl;
}
Derived( int a , int b , int c , int d )
:men2(b),Base1(a),Base3(c), Base2(d),men1(b) {
cout << "Derived" << endl;
}; private :
//构造从左到右
Base3 men3;
Base2 men2;
Base1 men1; //析构则是从底部开始往上析构,先 Base 1,2,3
}; int main(void ) { Derived obj(,,,);
return ; }

结果:

Base11
Base24
Base33
Default Base3
Base22
Base12
Derived
Derived 析构
Base1 析构
Base2 析构
Base3 析构
Base3 析构
Base2 析构
Base1 析构
请按任意键继续. . .

4. 以上是对于单继承的描述,如果是多继承,那么常规的话,我们很容易清楚器执行顺序,但是如果是虚继承,其执行顺序又会如何 ?

1. 现在我们来看这样一个图:它的运行结果又是如何.......

 #include<iostream>
using namespace std; class Boss { public :
Boss() {
cout << "this is Boss's constructor !" << endl;
};
Boss(int i) {
cout << "this is Boss's constructor !" \
<< " moneny=" << i << endl;
} void show() {
cout<<"宝剑磨砺,斩魂妖,时光磨砂,魔刃出"<<endl;
}
virtual ~ Boss() {
cout << "this is Boss's xigou function !" << endl;
}; //虚析构函数
}; //店小二
class xiao_er :virtual public Boss
{
public:
xiao_er() {
cout << "this is xiao_er's constructor !"<<endl;
}
xiao_er(int i) : Boss(i){
cout << "this is xiao_er's constructor !" \
<< " moneny=" << i << endl;
}
virtual ~xiao_er() {
cout << "this is xiao_er's xigou function !" << endl;
}
void show() {
cout << "我是店小二,客官 !" << endl;
}
}; //王二小
class er_xiao : virtual public Boss \
, virtual public xiao_er /*其实这里这个可以省去,但是这儿是为了写代码而写代码*/
{
public :
er_xiao() {
cout << "this is er_xiao's constructor !" << endl;
}
er_xiao(int i) : \
Boss(i) , xiao_er(i+)
{
cout << "this is er_xiao's constructor !" \
<< " moneny=" << i << endl;
}
virtual ~ er_xiao() {
cout << "this is er_xiao's xigou function !"<<endl;
}
void show() {
cout << "我是王二小,为坏人带路的王二小 !" << endl;
}
}; //天朝VIP员工
class VIP_em : virtual public Boss
{ public:
VIP_em(){
cout << "this is VIP_em's constructor !" << endl;
} VIP_em(int i) : \
Boss(i)
{
cout << "this is VIP_em's constructor !" \
<< " moneny=" << i << endl;
}
virtual ~VIP_em() {
cout << "this is VIP_em's xigou function !" << endl;
}
void show() {
cout << "我是VIP , 我有特权! "<<endl;
}
}; //熊孩子
class stupid_kid : virtual public VIP_em \
, virtual public xiao_er , \
virtual public er_xiao
{
public:
stupid_kid() {
cout << "this is stupid_kid's constructor !" << endl;
} stupid_kid(int i) : \
VIP_em(i) , xiao_er() , er_xiao(),xe(i)
{
cout << "this is stupid_kid's constructor !" \
<<" moneny="<<i<<endl;
}
~stupid_kid() {
cout << "this is stupid_kid's xigou function !"<<endl;
} void show() {
cout << "我是熊孩子,蜀黍,蜀黍,抱抱!" << endl;
}
private :
VIP_em vi;
xiao_er xe;
er_xiao ex;
}; int main(){ stupid_kid st();
//父类的函数被覆盖了
st.show();
//如何调用父类,强制是一种。
((Boss)st).show(); //stupid_kid *pt = &st;
//stupid_kid &sb = st;
// pt->show();
//((Boss)sb).show();
return ;
}

结果为:

this is Boss's constructor !
this is VIP_em's constructor ! moneny=100
this is xiao_er's constructor ! moneny=12
this is er_xiao's constructor ! moneny=13

-------------这部分为熊孩子的继承部分构造函数

下面是私有变量的构造函数

this is Boss's constructor ! 
this is VIP_em's constructor !

------私有变量 Vip_em调用无参数的构造函数 
this is Boss's constructor ! moneny=100 
this is xiao_er's constructor ! moneny=100

------私有变量  xiao_er调用有参数的构造函数

this is Boss's constructor !
this is xiao_er's constructor !

------私有变量 xiao_er调用无参数的构造函数 
this is er_xiao's constructor !

this is stupid_kid's constructor ! moneny=100
我是熊孩子,蜀黍,蜀黍,抱抱!
宝剑磨砺,斩魂妖,时光磨砂,魔刃出
this is Boss's xigou function !
this is stupid_kid's xigou function !
this is er_xiao's xigou function !
this is xiao_er's xigou function !
this is Boss's xigou function !
this is xiao_er's xigou function !
this is Boss's xigou function !
this is VIP_em's xigou function !
this is Boss's xigou function !
this is er_xiao's xigou function !
this is xiao_er's xigou function !
this is VIP_em's xigou function !
this is Boss's xigou function !
请按任意键继续. . .

6、 从上述代码可以不难看出,  虚内继承,避免了二义性,仅仅压缩了公有的你虚类继承类。

如果要弄清楚虚拟继承,就得先知道virtual table (vtbl) ----我们说的虚函数表

在内存那块, 会留 下一块连续的内存块,用作vtble存储JMP地址,而vtble里头存的便是virtual function(虚函数)地址,

每次继承时,基类都会产生一个vptr指针,指向派生类的地质,当 vptr指针指着同一个地址时,就不重复构造。 其他的,构造函数和析构函数,基于第一个代码列子。  根据自己对源码的理解和测试的总结,如有错误,还请多多指正。

C++继承与派生(原理归纳)的更多相关文章

  1. python 面向对象之继承与派生

    一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...

  2. Day7 类的继承和继承实现的原理

    继承可以分为但继承,多继承. 继承的基本形式 class ParentClass1(object): #定义父类 pass class ParentClass2: #定义父类 pass class S ...

  3. Day 5-2 类的继承和派生,重用

    类的继承 派生 在子类中重用父类 组合 抽象类 定义: 继承指的是类与类之间的关系,是一种什么“是”什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创建新类的方式,在python中,新 ...

  4. Python基础之继承与派生

    一.什么是继承: 继承是一种创建新的类的方式,新建的类可以继承一个或过个父类,原始类成为基类或超类,新建的类则称为派生类 或子类. 其中,继承又分为:单继承和多继承. class parent_cla ...

  5. Python入门之面向对象之类继承与派生

    本章内容 一.继承 二.抽象类 三.继承的实现原理 ======================================================= 一.继承 1. 继承的定义 继承是一 ...

  6. 6 python 继承与派生

    1.什么是继承? 继承指的是类与类之间的关系,是一种什么“是”什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类 父类又可以 ...

  7. 模块的封装之C语言类的继承和派生

    [交流][微知识]模块的封装(二):C语言的继承和派生 在模块的封装(一):C语言的封装中,我们介绍了如何使用C语言的结构体来实现一个类的封装,并通过掩码结构体的方式实 现了类成员的保护.这一部分,我 ...

  8. python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承                                                                          继承是一种创建新的类的方式,在pyth ...

  9. python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承 继承是一种创建新的类的方式,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. 派生:子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新 ...

  10. DAY7-面向对象之继承与派生

    一.初识继承 什么是继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类. 子类会“”遗传”父类的属性,从而解决代 ...

随机推荐

  1. Android 路径大全

    1 内部存储路径为/data/data/youPackageName/ 目录结构 //返回cache文件对象 this.getCacheDir(); //返回databases下指定文件 this.g ...

  2. mysql更改已有数据表的字符集,保留原有数据内容

    mysql更改已有数据表的字符集,保留原有数据内容     原文网址:http://blog.csdn.net/learn_2/article/details/6460370 环境:在应用开始阶段没有 ...

  3. 第一发。。。codeforces 609 C Load Balancing 贪心

    /*题意:给你一个序列经过最小变换,变换一次为一个数+1,一个数-1,使得最大值与最小值相差1:思路:与最后得到的序列相差的sum/2:*/#include<iostream> #incl ...

  4. javascript权威指南笔记--javascript语言核心(六)

    通过ECMAScript 3创建的属性都是可写的.可枚举的.可配置的. 在ECMAScript 5中,数据属性的4个特性分别是它的值.可写性.可枚举性.可配置性.存取器属性的特性是读取.写入.可枚举性 ...

  5. mysql概要(九)字符集和校对集

    1.mysql 字符集有细致设置: 2.mysql字符处理机制是:数据库和客户端之间存在一个字符集转换器(后文简称转换器)将客户端字符编码(必须告诉服务端的)转换成一种中间编码的数据(可自定义的但保证 ...

  6. dateTimePicker的使用,时间控件

    <li> <label>促销时间<span class="imprt">*</span></label> <inp ...

  7. 关于协程的学习 & 线程栈默认10M

    先看的这篇文章:http://blog.csdn.net/qq910894904/article/details/41699541 以nginx为代表的事件驱动的异步server正在横扫天下,那么事件 ...

  8. mybatis实战

    这篇教程不错,推荐:http://blog.csdn.net/techbirds_bao/article/details/9233599/

  9. Linux系统的介绍

    一.linux的特点: Linux是一个开源(源代码公开),免费的操作系统,其稳定性,安全性(也会有病毒,但因为linux是开源的,所以一旦有病毒就会有人去搞定它),处理多并发(月,NEC(日本电气股 ...

  10. tomcat字符,文档,数据库配置

    修改tomcat目录下conf目录下的server.xml tomcat容器的解码配置 URIEncoding="UTF-8" <Connector port="8 ...