C++ 继承、多继承、虚继承
多继承
/**
* 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 虚继承
/**
* 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:
结论: 虚继承是解决二义性的方案,不存在多份数据
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
}