一篇文章读懂C++ 继承

文章来源:c++从入门到精通(第四版 清华大学出版社)

目录

一.单继承

1.类的继承

2.继承后可访问性

3.构造函数访问顺序

4.子类显式调用父类构造函数

5.子类隐藏父类的父类函数

二.多重继承

1.多重继承定义

2.二义性

3.多重继承构造顺序


继承(inheritance)是面向对象的主要特征(此外还有封装和多态)之一,它使得一个类可以从现有的类中派生,而不必重新定义一个新的类。继承的实质是用已有的数据类型创建新的数据类型,并保留已有数据类型的特点,以旧类为基础创建新类,新类包含了旧类的数据成员和成员函数,并且可以在新类中添加新的数据成员和成员函数。旧类被称为基类或父类,新类被称为派生类或子类。

一.单继承

1.类的继承

class 派生类名标识符:[继承方式] 基类名标识符
{
	[访问控制修饰符:]
	[成员声明列表]
 } 

继承方式有三种派生类型,分别为公有(public)型、保护(protected)型和私有(private)型

,访问控制修饰符也是public、protected、private 3种类型。成员声明函数列表中包含类的成员变量和成员函数,是派生类新增的成员。“:”是一个运算符,表示基类和派生类之间的继承关系。

例如,定义一个继承员工类的操作成员类。

定义一个员工类,它包含员工id,员工姓名,所属部门等信息。

class CEmployee{//定义员工类 
	public:
		int m_ID;//id 
		char m_Name[128];//姓名 
		char m_Depart[128];//部门 
};

定义一个操作员类。通常操作员属于公司的员工,它包含员工ID,员工姓名,所属部门等信息,此外还包含密码信息、登陆方法等。

class COperator:public CEmployee//定义一个操作员类,从CEmployee类派生而来 
{
	public:
		char m_password[128];//定义密码 
		bool Login();
}

操作员类是从员工类派生的一个新类,新类中增加密码信息、登陆方法等信息,员工id、员工姓名、所属部门等信息直接从员工类中继承得到。

实例1 以公有方式继承

#include<bits/stdc++.h>
using namespace std;

class CEmployee{//定义员工类 
	public:
		int m_ID;//id 
		char m_name[128];//姓名 
		char m_Depart[128];//部门 
	CEmployee()
	{
		memset(m_name,0,128);//初始化m_name
		memset(m_Depart,0,128); 
	 } 
	void OutputName(){
		cout<<"员工姓名:"<<m_name<<endl;
	}
};
class COperator:public CEmployee//定义一个操作员类,从CEmployee类派生而来 
{
	public:
		char m_password[128];//定义密码 
		bool Login(){
			if(strcmp(m_name,"Phoebe")==0&&strcmp(m_password,"phoebe12345")==0)
			{
				cout<<"登陆成功!"<<endl;
				return true; 
			}
			else{
				cout<<"登录失败!"<<endl;
				return false; 
			}
		}
	
};
int main()
{
	COperator optr;
	strcpy(optr.m_name,"Phoebe");
	strcpy(optr.m_password,"phoebe12345");
	optr.Login();
	optr.OutputName();
	return 0;
}

程序中CEmployee类是COperator类中的基类,也就是父类,COperator类将继承CEmployee类的非私有成员(private类型成员不能被继承)。optr对象初始化m_name和m_password成员后,调用了Login成员函数。

用户在父类中派生子类时,可能存在一种状况,即在子类中定义了一个与父类名相同的成员函数。例如重新定义了一个COperator类,添加一个OutputName成员函数。

2.继承后可访问性

继承方式有public、private、protected 3种,它们的说明如下:

1.公有类派生

公有型派生表示对于基类中的public数据成员和成员函数,在派生类中依然是public;对于基类中的private数据成员和成员函数,在派生类中依然是private。

例如

class CEmployee{
	public:
		void Output()
		{
			cout<<m_ID<<endl;
			cout<<m_Name<<endl;
			cout<<m_Depart<<endl;
		}
	private:
		int m_ID;
		char m_Name[128];
		char m_Depart[128];
};
class COperator:public CEmployee
{
	public:
		void Output(){
			cout<<m_ID<<endl;//引用基类的私有成员 错误 
			cout<<m_Name<<endl;//引用基类的私有成员 错误 
			cout<<m_Depart<<endl;//引用基类的私有成员 错误 
			cout<<m_Password<<endl;//正确 
		}
	private:
		char m_password[128];
		bool Login();
		
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值