c++学习笔记十九——类的继承与派生

什么是类的派生与继承?
面对对象的程序设计中提供了类的继承机制,允许程序员在保持原有类特性的基础上,进行更具体,更详细的类的定义。已原有类为基础产生新的类,我们就说新的类继承了原有类的特征,也可以说从原有类派生出新类。
派生类的定义格式

class 派生类名:继承方式 基类名1 ,继承方式 基类名2,继承方式 基类名3....
{
派生类成员声明;
}

基类名:已有类的名称
派生类名:是是继承原有特性新的类名,一个派生类可以继承多个基类,这种情况称为多继承,一个派生类只有一个继承的基类称为单继承。
继承方式:继承方式规定了如何从基类继承成员,继承方式的关键字:public ,private,protected,分别表示公有继承,私有继承以及保护继承。后面会做详细的介绍。
派生类成员声明:除了从基类继承的成员,派生类新增的成员。
类的派生过程总共分为三个步骤 :吸收基类成员,改造基类成员,添加新的成员。
类的访问控制
基类成员的继承方式可以有公有,保护和私有三种访问属性,不同的访问方式,导致不同属性的基类成员在派生类中的属性也有所不同。访问主要分为两种:第一种是派生类的新增成员访问继承基类的成员。第二种类外通过对象名访问类内成员。
公有继承:
**当类的继承方式为公有继承时,基类的公有成员和保护成员访问属性在派生类中保持不变,而基类的私有成员不可以直接访问。**也就是说基类的公有成员和保护成员在派生类中访问属性不变,仍作为派生类中公有成员和保护成员,派生类中的其他成员可以直接访问他们。在类族之外只能通过派生类的对象访问从基类继承的公有成员。而无论是派生类成员还是派生类的对象都无法直接访问基类的私有成员。
举例如下
point.h头文件

//定义point类
#ifndef point_h
#define point_h
class point
{
private:
	int x, y;
public:
	point(int x = 0, int y = 0) :x(x), y(y) {
		std::cout << "construct called" << std::endl;

	}
	void init(int x,int y) {
		this->x = x;
		this->y = y;
	}
	void move(int offx, int offy)
	{
		x += offx;
		y += offy;
	}
	int getx() { return x; }
	int gety() { return y; }
};
#endif 

rectangle.h头文件

#ifndef rectangle1
#define rectangle1
# include "point.h"
class rectangle:public point
{
private:
	int w;
	int h;
public:
	
	void initrectangle(int x, int y, int w1, int h1)
	{
		init(x, y);
		w = w1;
		h = h1;
	}
	int getw() { return w; }
	int geth() { return h; }
};
#endif 

主函数调用

#include<iostream>
#include<string>
#include"rectangle.h"

using namespace std;


int main()
{
	rectangle test1;
	test1.initrectangle(1,2,3,4);
	test1.move(2, 2);
	cout << test1.getx() << " " << test1.gety() << " " << test1.getw() << " " << test1.geth() << endl;
}

输出结果
运行结果
从结果中我们可以看到,当继承方式为公有继承时,派生类中新添成员可以直接访问基类中的成员,在类外可以通过对象名.成员名的方式访问类中成员。而无论是派生类成员还是派生类中的对象都无法直接访问基类的私有成员。
私有继承

当类的成员以私有方式继承时,基类中的公有成员和保护成员都以私有成员身份出现在派生类中,而私有成员在派生类中不可直接访问。也就是说基类的公有成员和保护成员被基类继承以后都作为派生类的私有成员,派生类的其他成员可以访问私有成员,但是在类族外无法通过对象名.成员名直接访问他们,无论是派生类继承的对象还是其他派生类成员,都无法直接访问从基类的私有成员。
用以上的例子解释,我们如果采用私有方式继承,那么基类的保护成员以及公有成员将被当作派生类中的私有成员,无法从类外直接访问,但是派生类中的成员可以互相访问,我们讲 rectangle.h头文件更改如下:

#ifndef rectangle1
#define rectangle1
# include "point.h"
class rectangle:private point
{
private:
	int w;
	int h;
public:
	
	void initrectangle(int x, int y, int w1, int h1)
	{
		init(x, y);
		w = w1;
		h = h1;
	}
	int getx() { return point::getx(); }
	int gety() { return point::gety(); }
	int getw() { return w; }
	int geth() { return h; }
};
#endif 

还有一种方式为保护继承,这里不做详细介绍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值