C++继承,语法+案例,超详细!!

类的继承

继承是代码重用的一种方法。

通过继承创建的新类称为“派生类”或“子类”,被继承的类称为“基类”或“父类”。

继承即子类无需重新编写父类成员代码的情况下继承父类所有的成员,子类只需书写新增成员的代码

语法:

class 子类名 : 继承方式 父类名1 , 继承方式 父类名2 , ..... , 继承方式 父类名n 
{
	派生类的成员
};

C++继承,语法+案例,超详细!!_第1张图片

private:1.该类中的函数、2.友元函数访问。不能被任何其他访问,该类的对象也不能访问。
protected:1.该类中的函数、2.子类的函数、3.友元函数访问。但该类的对象不能访问。
public:1.该类中的函数、2.子类的函数、3.其友元函数,4.该类的对象访问

类的继承 举例

举例:

#include
using namespace std;
class Student
{
	int id;
	string name;
	int age;
	public:
		void SetIn(int _id,string _name,int _age)
		{
			id = _id;
			name = _name;
			age = _age;	
		}	
		void Print()
		{
			cout<<"id:"<

C++继承,语法+案例,超详细!!_第2张图片

总结:

1、继承中,先调用父类构造函数,再调用子类构造函数,析构函数顺序与构造函数相反

2、若父类与子类成员函数同名,子类直接调用则是子类中的同名函数,子类加作用域才能访问父类同名函数,格式:子类名.父类名::同名函数;

菱形继承

菱形继承概念:

​ 两个子类继承同一个父类

​ 又有某个类同时继承着两个派生类

​ 这称为菱形继承或钻石继承

C++继承,语法+案例,超详细!!_第3张图片

菱形继承的问题

1、狮子继承了动物的数据,老虎继承了动物的数据,当狮虎兽使用数据时,就会产生二义性

二义性:指无法直接通过变量名进行读取,需要通过域(::)成员运算符进行区分

2、狮虎兽继承了来自动物的数据且继承了两份,其实只需要一份

举例:

#include
using namespace std;
class Animal
{
	public:
		int age;
};
class Sheep : public Animal
{

};
class Camel : public Animal
{

}; 
class Alpace : public Sheep , public Camel
{
		d
};
void test()
{
	Alpace a;
			//当菱形继承,两个父类拥有相同数据,需要用作用域区分
	a.Sheep::age = 20;		
	a.Camel::age = 1;
	cout<<"a.Sheep:"<

C++继承,语法+案例,超详细!!_第4张图片

明明只需要一个age成员函数,但是却出现两个,造成浪费

解决菱形继承问题的办法是 虚继承

虚继承

虚继承是指在定义派生类时,通过关键字virtual来强制指定所继承的基类为虚基类

语法:

	class  子类 : virtual 继承方式 父类
	{
		子类新增的数据成员和成员函数
	}

C++继承,语法+案例,超详细!!_第5张图片

举例

#include
using namespace std;
class Animal
{
	public:
		int age;
};
class Sheep :virtual public Animal
{

};
class Camel :virtual public Animal
{

}; 
class Alpace : public Sheep , public Camel
{
		
};
void test()
{
	Alpace a;
	a.Sheep::age = 20;
	cout<<"a.Sheep:"<

C++继承,语法+案例,超详细!!_第6张图片

虽然继承了两个相同的数据,但是这两个相同的数据的地址是相同的

#include
using namespace std;
class Person
{
	int no;
	string name;
	
	public:
		void Set_P(int _no,string _name)		//构造函数不能是虚函数
		{
			no = _no;
			name = _name;
		}
		void Print()
		{
			cout<<"编号:"<

详细规则请看 虚函数与纯虚函数

你可能感兴趣的:(C++,c++,算法,开发语言)