C++ 继承、多继承、虚继承

190 阅读2分钟

C++ 继承、多继承、虚继承

多继承

图片.png

/**
 * Created by hehe on 23-6-10.
 * 多继承(存在二义性,需要注意) demo代码,
 * 虚继承(virtual public Object)就是解决歧义的 方案
 */
#include <iostream>

using namespace std;

// 祖父类
class Object{
public:
    int number;
};

// 父类1
class BaseActivity1: public Object{
public:
    void onCreate(){
        cout << "BaseActivity1-onCreate()" << endl;
    }

    void onStart(){
        cout << "BaseActivity1-onStart()" << endl;
    }
    void show(){
        cout << "BaseActivity1-show: " << number << endl;
    }
};

// 父类2
class BaseActivity2: public Object{
public:
    void onCreate(){
        cout << "BaseActivity2-onCreate()" << endl;
    }

    void onStart(){
        cout << "BaseActivity2-onStart()" << endl;
    }
    void show(){
        cout << "BaseActivity2-show: " << number << endl;
    }
};

class Son: public BaseActivity1, public BaseActivity2{

};

int main(){
    Son son;
    // 明确指定调用哪个父类的方法, 存在多份
    son.BaseActivity1::onCreate();
    son.BaseActivity2::onCreate();
    // 没有虚继承的情况
    // son.number = 1; //这样是会报错的,因为不知道是BaseActivity1::number 还是BaseActivity2::number
    son.BaseActivity1::number = 1;
    son.BaseActivity2::number = 2;
    cout << "son.BaseActivity1::number = " << son.BaseActivity1::number << endl; //son.BaseActivity1::number = 1
    cout << "son.BaseActivity2::number = " << son.BaseActivity2::number << endl; //son.BaseActivity2::number = 2

    return 0;
}

virtual 虚继承

图片.png

/**
 * Created by hehe on 23-6-10.
 * 多继承(存在二义性,需要注意) demo代码,
 * 虚继承(virtual public Object)就是解决歧义的 方案
 */
#include <iostream>

using namespace std;

// 祖父类
class Object{
public:
    int number;
    void show(){ // 子类没有覆盖就只会显示 本身的number
        cout << number << endl;
    }
};

// 父类1
class BaseActivity1: virtual public Object{
public:
    void onCreate(){
        cout << "BaseActivity1-onCreate()" << endl;
    }

    void onStart(){
        cout << "BaseActivity1-onStart()" << endl;
    }
    void show(){
        cout << "BaseActivity1-show: " << number << endl;
    }
};

// 父类2
class BaseActivity2: virtual public Object{
public:
    void onCreate(){
        cout << "BaseActivity2-onCreate()" << endl;
    }

    void onStart(){
        cout << "BaseActivity2-onStart()" << endl;
    }
    void show(){
        cout << "BaseActivity2-show: " << number << endl;
    }
};

class Son: public BaseActivity1, public BaseActivity2{
};

int main(){
    Son son;

    // 没有虚继承的情况,存在多份
    // son.number = 1; //这样是会报错的,因为不知道是BaseActivity1::number 还是BaseActivity2::number
    son.BaseActivity1::number = 1;
    son.BaseActivity2::number = 2;
    cout << "son.BaseActivity1::number = " << son.BaseActivity1::number << endl; //son.BaseActivity1::number = 2
    cout << "son.BaseActivity2::number = " << son.BaseActivity2::number << endl; //son.BaseActivity2::number = 2

    BaseActivity1 baseActivity1;
    BaseActivity2 baseActivity2;
//    son.number = 100;
    baseActivity1.number = 201;
    baseActivity2.number = 202;
//    cout << "son.number: " << son.number << endl;

    cout << "baseActivity1.number: " << baseActivity1.number << endl;//baseActivity1.number: 201
    cout << "baseActivity1.show(): "; baseActivity1.show();//baseActivity1.show(): BaseActivity1-show: 201
    cout << "son.BaseActivity1::show(): "; son.BaseActivity1::show();//son.BaseActivity1::show(): BaseActivity1-show: 2
    cout << "baseActivity2.number: " << baseActivity2.number << endl;//baseActivity2.number: 202
    cout << "son.BaseActivity2::show(): "; son.BaseActivity2::show();//son.BaseActivity2::show(): BaseActivity2-show: 2

    return 0;
}

输出的log:图片.png

结论: 虚继承是解决二义性的方案,不存在多份数据

static 修饰的变量,存在于 静态区(类似堆,栈的空间划分,静态区不会自动回收)

int test(){
	static int n = 0; //调用一次, 位于静态区,弹栈不会回收
    n++;
    return n;
}

int main(){
    test(); //1
    test(); //2
    test(); //3
    test(); //4
    test(); //5
    cout << test() << endl; //6
}