继承和派生
父类(基类),子类(派生类)
公有继承public(主导)
#include <iostream>
using namespace std;
class Net{
public:
int a;
private:
int b;
protected:
int c;
};
class H1:public Net{
public:
void show(){
a = 11;
cout << "a=" << a << endl;
// b = 2; //不能访问
// cout << "b=" << b << endl; //不能访问
c = 33;
cout << "c=" << c << endl;
}
};
int main()
{
H1 a;
//公有继承:父类的公有在子类也是公有
//可以通过外部和内部访问
a.a = 1;
cout << a.a << endl;
a.show();
//公有继承:父类的私有在子类不可见
//外部和内部都不能访问
// a.b = 2; //不能访问
// a.show(); //不能访问
//公有继承:父类的保护在子类也是保护
//外部不能访问,内部能访问
// a.c = 1; //不能访问
// cout << a.c << endl; // 不能访问
a.show();
return 0;
}
公有继承:父类的私有数据在子类中不可见,其他数据保持原样
保护继承protected
#include <iostream>
using namespace std;
class Net{
public:
int a;
private:
int b;
protected:
int c;
};
class H1:protected Net{
public:
void show(){
a = 11;
cout << "a=" << a << endl;
// b = 2; //不能访问
// cout << "b=" << b << endl; //不能访问
c = 33;
cout << "c=" << c << endl;
}
};
int main()
{
H1 a;
//公有继承:父类的公有在子类变为保护
//可以通过外部不能访问,内部能访问
// a.a = 1; //不能访问
// cout << a.a << endl; //不能访问
a.show();
//公有继承:父类的私有在子类不可见
//外部和内部都不能访问
// a.b = 2; //不能访问
// a.show(); //不能访问
//公有继承:父类的保护在子类也是保护
//外部不能访问,内部能访问
// a.c = 1; //不能访问
// cout << a.c << endl; // 不能访问
a.show();
return 0;
}
保护继承:父类的私有数据在子类中不可见,其他数据变为保护
私有继承private
#include <iostream>
using namespace std;
class Net{
public:
int a;
private:
int b;
protected:
int c;
};
class H1:private Net{
public:
void show(){
a = 11;
cout << "a=" << a << endl;
// b = 2; //不能访问
// cout << "b=" << b << endl; //不能访问
c = 33;
cout << "c=" << c << endl;
}
};
int main()
{
H1 a;
//公有继承:父类的公有在子类变为私有
//可以通过外部不能访问,内部能访问
// a.a = 1; //不能访问
// cout << a.a << endl; //不能访问
a.show();
//公有继承:父类的私有在子类不可见
//外部和内部都不能访问
// a.b = 2; //不能访问
// a.show(); //不能访问
//公有继承:父类的保护在子类变为私有
//外部不能访问,内部能访问
// a.c = 1; //不能访问
// cout << a.c << endl; // 不能访问
a.show();
return 0;
}
私有继承:父类的私有数据在子类中不可见,其他数据变为私有
继承的优点:减少代码的冗余,提高代码的重用性
不管什么继承方式,父类中的私有数据在子类中不可见
继承的内层结构
子类构造和析构的顺序:(构造)父类构造-》子类构造;(析构)子类析构-》父类析构
子类中有父类和对象成员 构造和析构顺序:
详解子类中的构造
实例化对象时,子类默认会调用
子类想要调用父类的有参构造,需显式调用(子类必须用初始化列表显式调用父类的有参构造)
父类和子类同名成员数据 处理
3.子类可以借助父类的公有方法间接的操作父类的数据
子类和父类同名成员函数
一旦子类实现父类同名成员函数 就会屏蔽父类中的所有同名函数
如果用户必须调用父类的同类成员函数,必须加作用域
继承中的静态成员特性
静态成员由所有成员对象共享
同名静态成员函数
多继承
多继承容易产生:(二义性:父类之间出现同名) -》解决办法1:加作用域
菱形继承(具有公共祖先)解决方法2:采用虚基类
虚继承
虚继承时会在子类产生额外的虚基类指针,虚基类指针指向虚基类表,虚基类表中存放data的偏移量
注:仅用于学习总结