C++面向对象的讲解(二)简单学习

本文详细介绍了C++中的类继承,包括继承的概念、派生类与基类的关系、继承方式(公有、保护、私有),以及派生类构造函数的使用。此外,还阐述了构造函数和析构函数的调用顺序,强调了继承在代码重用和类层次结构构建中的重要性。
摘要由CSDN通过智能技术生成

C++类的继承

1、继承定义:

继承就是在已有类的基础上创建新的类的过程,已有类成为基类,新类成为派生类。换句话说,就是新类将基类中的某些数据成员和成员函数给拿过来自己用了。同一个基类可以被多个派生类继承,同一个派生类同样也可以继承多个基类;只能从一个基类继承的方式叫单继承,可以从多个基类继承的方式叫多继承。

class 派生类名∶派生方式 基类名{
// 派生类新增的数据成员和成员函数
} ;
class student : public person{//单继承
……
}
class student : public s1,private s2,……{//多继承
……
}

为什么要使用继承?
继承性也是程序设计中的一个非常有用的、有力的特性, 它可以让程序员在既有类的基础上,通过增加少量代码或修改少量代码的方法得到新的类, 从而较好地解决了代码重用的问题。

2、派生类与基类继承的事项:

1、派生类除了继承基类的某些数据成员和成员函数外还可以新增自己的数据成员和成员函数;

2、派生类可以重载基类的成员函数;

3、派生类可以重定义基类已有的成员函数;

4、派生类可以改变基类成员在派生类中的访问属性;

5、派生类不可以继承基类的构造函数和析构函数

6、派生类不可以继承基类的友元函数;

7、派生类不可以继承基类静态数据成员和静态成员函数;

3、继承方式:

有公有继承(public)、保护继承(protected)和私有继承(private)三种方式。如果省略继承方式,c++会默认为private继承。
1)公有继承(public)下,基类的访问权限在派生类中不变;

2)保护继承(protected)下基类的protected成员可以被派生类直接访问,但不能被派生类的外部函数访问;

3)私有继承(private)下,基类的private成员在派生类中不变,而基类中的public和protected成员在派生类中会变为private成员。

4、派生类的构造函数:

因为派生类不能继承父类的构造函数,所以我们需要根据情况来建立合适的构造函数。

派生类构造函数的形式:

派生类构造函数名(总形式参数表列):基类构造函数名(实际参数表列){派生类中新增数据成员初始化语句}
Student(int n,string nam,char s,int a,string ad):person(n,nam,s),age(a),add(ad){}
//Student为派生类,person、age、add为父类
//:表示显式调用,调用各个父类的构造函数,因为是调用函数,所以父类里的参数为实际参数,不需要加数据类型

分为下列三种情况:
1.父类没有声明构造函数
(1)子类也没有声明自己的构造函数,则父类和子类均由编译器生成默认的构造函数。既不需要建立派生类的构造函数,父类子类都采用默认构造函数

(2)子类中声明了构造函数(无参或者带参),则子类的构造函数可以写成任何形式,不用顾忌父类的构造函数。在创建子类对象时,先调用父类默认的构造函数(编译器自动生成),再调用子类的构造函数。

class person :public student//student为父类,这里没有写出来
{
public:
	person(int _x) :student() {//这里student()表示调用student的默认构造函数
		x = _x;
	}
private:
	int x;
};

2.父类只声明了无参构造函数
如果子类的构造函数没有显式地调用父类的构造,则将会调用父类的无参构造函数。也就是说,父类的无参构造函数将会被隐式地调用。

内容同上

3.父类只声明了带参构造函数
此时,派生类必须建立构造函数

class student
{
public:
	student(int _age,string _name,string _id) {//父类的带参构造函数
		age = _age;
		name = _name;
		id = _id;
	}
	void print() {
		cout << age << " " << name << " " << id;
	}
	~student() {}
private:
	int age;
	string name;
	string id;
protected:
};

class person :public student//公有继承(单继承)
{
public:
	person(int _age, string _name, string _id, int _x) :student(_age, _name, _id) {
		x = _x;
	}//建立派生类构造函数,形式: 派生类构造函数名(总形式参数表列):基类构造函数名(实际参数表列){派生类中新增数据成员初始化语句}
private:
	int x;
};

int main() {
	person s(46,"li","2017217",5);//46传给_age,li传给_name,2017217传给_id,5传给x
	s.print();//调用父类的函数
	return 0;
}

5、派生类构造函数和析构函数的执行顺序:

构造函数的调用严格地按照先调用基类的构造函数, 后调用派生类的构造函数的顺序执行。
析构函数的调用顺序与构造函数的调用顺序正好相反,先调用派生类的析构函数, 后调用基类的析构函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值