C++继承与派生(原理归纳)

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

C++继承与派生(原理归纳)

2. 对于继承方式 :

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

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

C++继承与派生(原理归纳)

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(1,2,3,4);
    return 0;
   
}

结果:

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

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

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

C++继承与派生(原理归纳)

#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;
    }
};

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a086b935f2949ec73770d1855fd43b09.html