第六天之继承与派生

1、继承概念

面向对象程序设计有4个主要特点:抽象、封装、继承和多态性。我们已经讲解了类和对象,了解了面向对象程序设计的两个重要特征一数据抽象与封装,已经能够设计出基于对象的程序,这是面向对象程序设计的基础。
要较好地进行面向对象程序设计,还必须了解面向对象程序设计另外两个重要特 征——继承性和多态性。本章主要介绍有关继承的知识,多态性将在后续章节中讲解。
继承性是面向对象程序设计最重要的特征,可以说,如果没有掌握继承性,就等于没有掌握类和对象的精华,就是没有掌握面向对象程序设计的真谛。

类之间的关系
has-A,uses-A 和 is-A
has-A 包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类。
uses-A 一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友员或对象参数传递实现。
is-A 机制称为“继承”。关系具有传递性,不具有对称性。

继承的概念
在这里插入图片描述

派生类的定义
在这里插入图片描述

继承重要说明
1、子类拥有父类的所有成员变量和成员函数
4、子类可以拥有父类没有的方法和属性

2、子类就是一种特殊的父类
3、子类对象可以当作父类对象使用

实例

#include <iostream>
using namespace std;



class Parent {
public:
	void print()
	{
		a = 0;
		b = 0;
		cout << "a = " << a << endl;
		cout << "b = " << b << endl;
	}
	int a;
	int b;
private:
	
};
//class Child : protect Parent
//class Child : private Parent
class Child : public Parent
{
public:
	
private:
	int c;

};


void main()
{
	Child c1;
	c1.a = 2;
	c1.b = 3;
	c1.print();
	system("pause");
}

在这里插入图片描述

2、派生类的访问控制

派生类继承了基类的全部成员变量和成员方法(除了构造和析构之外的成员方法),
但是这些成员的访问属性,在派生过程中是可以调整的。

单个类的访问控制
1)C++中的继承方式会影响子类的对外访问属性
public继承:父类成员在子类中保持原有访问级别
private继承:父类成员在子类中变为private成员
protected继承:父类中public成员会变成protected
父类中protected成员仍然为protected
父类中private成员仍然为private
2)private成员在子类中依然存在,但是却无法访问到。不论种方式继承基类,派生类都不能直接使用基类的私有成员 。
3)C++中子类对外访问属性表
父类成员访问级别

在这里插入图片描述
“三看”原则
C++中的继承方式(public、private、protected)会影响子类的对外访问属性
判断某一句话,能否被访问
1)看调用语句,这句话写在子类的内部、外部
2)看子类如何从父类继承(public、private、protected)
3)看父类中的访问级别(public、private、protected)

派生类类成员访问级别设置的原则
思考:如何恰当的使用public,protected和private为成员声明访问级别?
1、需要被外界访问的成员直接设置为public
2、只能在当前类中访问的成员设置为private
3、只能在当前类和子类中访问的成员设置为protected,protected成员的访问权限介于public和private之间。

综合训练

#include <cstdlib>
#include <iostream>

using namespace std;

class A
{
private:
	int a;
protected:
	int b;
public:
	int c;

	A()
	{
		a = 0;
		b = 0;
		c = 0;
	}

	void set(int a, int b, int c)
	{
		this->a = a;
		this->b = b;
		this->c = c;
	}
};

class B : public A
{
public:
	void print()
	{
		//cout<<"a = "<<a; //err
		cout << "b = " << b;//ok
		cout << "c = " << endl;//ok
	}
};

class C : protected A
{
public:
	void print()
	{
		//cout<<"a = "<<a; //err
		cout << "b = " << b;//ok
		cout << "c = " << endl;//ok
	}
};

class D : private A
{
public:
	void print()
	{
		//cout<<"a = "<<a; //err
		cout << "b = " << b << endl;//ok
		cout << "c = " << c << endl;//ok
	}
};

int main(int argc, char *argv[])
{
	A aa;
	B bb;
	C cc;
	D dd;

	aa.c = 100; //ok
	bb.c = 100; //ok
	//cc.c = 100; //err
	//dd.c = 100; //err

	aa.set(1, 2, 3);	//ok
	bb.set(10, 20, 30); //ok
	//cc.set(40, 50, 60); //err
	//dd.set(70, 80, 90); //err

	bb.print();		//ok
	cc.print();		//ok
	dd.print();		//ok

	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值