C++ 继承和派生 多继承

继承与派生:

基类(或父类):被继承的所有的类(人类)
派生类(或子类):从基类中继承新增部分特性的类

class 子类:继承方式 基类1,继承方式 基类2...
{	
};

继承目的:实现设计与代码的重用,充分利用原有的类

继承方式:1、公有继承,2私有继承,3保护继承
简要版
Public继承
公有->公有 私有->不可访问 保护->保护
!基类中的私有成员虽然不能直接在子类中访问,但是可以通过非私有接口访问
protected 继承
公有->保护 私有->不可访问 保护->保护
private 继承
公有->私有 私有->不可访问 保护->私有
详细版
1、公有继承:public
基类 子类
保护 保护(类外不能引用,类内能访问)
公有 公有 (类外能引用,类内能访问)
私有 不可访问 (类外不能引用,类内也不能访问)
PS:基类中的私有虽然不能直接在子类中访问,但是可以通过基类提供的非私有方法来访问该基类私有成员
2、私有继承:private
基类 子类
保护 私有(类外不能引用,类内能访问)
公有 私有 (类外不能引用,类内能访问)
私有 不可访问 (类外不能引用,类内也不能访问)
PS:基类中的私有虽然不能直接在子类中访问,但是可以通过基类提供的非私有方法来访问该基类私有成员
3、保护继承:protected
基类 子类
保护 保护(类外不能引用,类内能访问)
公有 保护 (类外不能引用,类内能访问)
私有 不可访问 (类外不能引用,类内也不能访问)
PS:基类中的私有虽然不能直接在子类中访问,但是可以通过基类提供的非私有方法来访问该基类私有成员
PS:继承时,不会选择性地继承(而是将父类所有资源拷贝一次放置在子类中)

构造器:每个对象都是由构造器来生成对象的
(派生类中:不仅要实例化新增加部分,还实例继承的部分)

1、子类构造器:不仅要构造自己新增成员,还需要通过初始化列表来调用基类构造器来构造继承的基类成员(若子类的构造器不去调用基类的构造器,默认调用基类的无参构造器)
初始化列表:
student(…):people(…)

PS:子类的构造器只能实例新的成员,继承过来的成员只能由该基类的构造器来实例化
PS:先调用基类构造器,再调用子类构造器

2、析构器:当对象被释放时,会向对象发送析构消息,来通知对象作善后处理。
PS:当子类对象被释放时,先调用子类的析构器,再调用基类的析构器
PS:子类中只需要对新增的部作善后处理,基类的善后交给基类的析构器。

重写

当父类方法不满足子类时,子类可以重写定义该方法。(子类中基类的方法不会被替换,只是子类的作用域优先调用)

class parent
{
	void show()
	{
		cout<<"我是父亲"<<endl;
	}
};
class child
{
	//重写:
	void show()
	{
		cout<<"我是子对象"<<endl;
	}
};
PS:child中有两个show函数,只是child::show的作用覆盖了parent::show
child c;
c.show();//输出:  我是子对象,注意:父类中show方法没有被替换
c.parent::show();//输出:  我是父亲
		
#include<iostream>
using namespace std;
class people
{
public:
	people()
	{
		cout<<"people()"<<endl;
	}
	people(const char* n,char sex,short age):name(n),sex(sex),age(age)
	{
		cout<<"people(...)"<<endl;
	}
	~people()
	{
			cout<<"~people"<<endl;
	}
	void show()
	{
		cout<<name<<" "<<sex<<" "<<age<<endl;
	}
protected:
	string name;//类对象作成员,由people类来调用构造器
	char sex;
	short age;
};
class student:public people
{
public:
	student():people()
	{
		cout<<"student()"<<endl;
	}
	student(const char* n,char sex,short age,float c):people(n,sex,age),c(c)
	{
		cout<<"student(...)"<<endl;
	}
	~student()
	{
		cout<<"~student"<<endl;
	}
	void display()
	{
		cout<<name<<sex<<c<<endl;
	}
protected:
	float c;//分数
};
int main()
{
	student zh("zh",'m',22,98);

	student zh1;



	return 0;
}

多继承

同多个基类中派生出子类(子类拥有多个基类)
语法:

class 子类:继承方式 基类1,继承方式 基类2...
{
	//基类继承部分
	//新增部分
};

1、构造器:不仅要构造子类新增加部分,还需要通过初始化列表调用基类构造器来构造基类部分。
子类构造器(…):基类构造器(…),基类构造器2(…),…
构造顺序:1、先构造基类(基类顺序继承列表顺序决定),再构造子类
2、析构器的理论知识点与单继承一样。
析构顺序与构造顺序相反
菱形多继承:拥有公共基类的多继承,公共继承出现浪费空间
用虚基类解决,详见文章
https://blog.csdn.net/Y_yibao/article/details/103807497

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值