系列文章目录
【C++基础】面向对象方法(一)
【C++基础】面向对象方法(二)
【C++基础】面向对象方法(三)
【C++基础】面向对象方法(四)
【C++基础】面向对象方法(五)
一、继承
继承是类的一个重要特性,它允许程序员基于已有的类创建自己的新类。在C++中,如果一个类CI通过继承已有的类C而创建,则将CI称作派生类(也称做子类),将C称做基类(也称做父类)。
· 派生类会继承基类中定义的所有属性和方法;
· 派生类也能够在派生类中定义派生类所特有的属性和方法。
“继承”这种复用方式缩短了软件开发时间,使得开发人员可以复用已经测试和调试好的高质量的类,减少了系统投入使用后可能出现的问题。
二、派生类
(1)定义派生类的语法
class 派生类名:继承方式 基类名
{
派生类成员声明;
};
其中继承方式包括:public公有继承,protected保护继承,private私有继承。
示例代码如下所示:
//derivedClassDef.cpp
#include<iostream>
using namespace std;
class Person
{
public:
void SetName(char* name)
{
strcpy_s(m_name, name);
}
char* GetName()
{
return m_name;
}
void SetGender(bool gender)
{
m_gender = gender;
}
bool GetGender()
{
return m_gender;
}
private:
char m_name[20]; //姓名
bool m_gender; //性别(true:男,false:女)
};
class Student :public Person
{
private:
char m_sno[8];
char m_major[20];
public:
void SetSNO(char* sno)
{
strcpy_s(m_sno, sno);
}
char* GetSNO()
{
return m_sno;
}
void SetMajor(char* major)
{
strcpy_s(m_major, major);
}
char* GetMajor()
{
return m_major;
}
void DisplayInfo()
{
cout << "学生信息:" << endl
<< "学号:" << m_sno << endl
<< "姓名:" << GetName() << endl //派生类Student不能直接访问从基类Person中继承下来的私有成员m_name和m_gender
<< "性别:";
if (GetGender() == true) //派生类Student不能直接访问从基类Person中继承下来的私有成员m_name和m_gender
cout << "男" << endl;
else
cout << "女" << endl;
cout << "专业:" << m_major << endl;
}
};
int main()
{
Student student;
student.SetSNO("1210101");
student.SetName("张三");
student.SetGender(true);
student.SetMajor("计算机应用");
student.DisplayInfo();
return 0;
}
(2)访问控制方式
public:类的公有成员,在任何地方都可以直接访问。
private:类的私有成员,只在该类的成员函数中可以直接访问,在其他地方均不能直接访问。
protected:类的保护成员,在该类及其派生类的成员函数中可以直接访问,在其他地方不能直接访问。
代码如下:
class Person
{
public:
......
protected:
char m_name[20];
bool m_gender;
};
(3)派生类的继承方式
派生类从基类继承过来的成员的访问控制方式由两点决定:
· 该成员在基类中的访问控制方式
· 定义派生类所采用的继承方式
(4)派生类中函数的重定义
对于从基类中继承下来的成员函数,在派生类中可以对其重新定义、实现新的功能。
例:基类Person类中定义一个DisplayInfo()函数,功能是显示个人信息。在派生类Student类中对该函数进行重新定义,实现显示学生信息的功能。
代码如下:
#include<iostream>
using namespace std;
class Person
{
public:
void SetName(char* name)
{
strcpy_s(m_name, name);
}
char* GetName()
{
return m_name;
}
void SetGender(bool gender)
{
m_gender = gender;
}
bool GetGender()
{
return m_gender;
}
void DisplayInfo()
{
cout << "个人信息:" << endl
<< "姓名:" << m_name << endl
<< "性别:";
if (m_gender == true)cout << "男" << endl;
else cout << "女" << endl;
}
protected:
char m_name[20]; //姓名
bool m_gender; //性别(true:男,false:女)
};
class Student :public Person
{
private:
char m_sno[8];
char m_major[20];
public:
void SetSNO(char* sno)
{
strcpy_s(m_sno, sno);
}
char* GetSNO()
{
return m_sno;
}
void SetMajor(char* major)
{
strcpy_s(m_major, major);
}
char* GetMajor()
{
return m_major;
}
void DisplayInfo()
{
cout << "学生信息:" << endl
<< "学号:" << m_sno << endl
<< "姓名:" << m_name << endl
<< "性别:";
if (m_gender == true)
cout << "男" << endl;
else
cout << "女" << endl;
cout << "专业:" << m_major << endl;
}
};
int main()
{
Student student;
Person person;
student.SetSNO("1210101");
student.SetName("张三");
student.SetGender(true);
student.SetMajor("计算机应用");
person.SetName("李四");
person.SetGender(false);
student.DisplayInfo();
person.DisplayInfo();
return 0;
}
当使用Person类对象调用时,就会调用Person类中定义的DisplayInfo()函数;而当使用Student类对象student调用时,就会调用Student类中定义的DisplayInfo()函数。
(5)派生类的构造函数和析构函数
派生类构造函数的作用:
主要是对派生类中新添加的数据成员做初始化工作;在创建派生类对象、执行派生类构造函数时,系统会自动调用基类的构造函数来对基类中定义的数据成员进行初始化。
派生类析构函数的作用:
主要是清除派生类中新添加的数据成员、释放它们所占据的系统资源;在销毁派生类对象、执行派生类析构函数时,系统会自动调用基类的析构函数来释放基类中数据成员所占据的系统资源。
(6)派生类构造函数的定义
派生类中构造函数的定义有以下两种形式:
可以将派生类构造函数形参列表中的形参作为实参传递给基类构造函数,也可以将常量、全局变量等作为实参传递给基类构造函数。
形式1
派生类名(形参列表):基类名(实参列表)
{
//派生类中数据成员的初始化
......
}
形式2
派生类名(形参列表)
{
//派生类中数据成员的初始化
......
}
(7)派生类析构函数的定义
派生类中析构函数的定义形式与基类完全相同,其语法格式为:
~派生类名()
{
//释放派生类中数据成员所占用的额外系统资源等
......
}
例:为基类Person和派生类Student定义构造函数和析构函数。
#include<iostream>
using namespace std;
class Person
{
public:
Person(char* name, bool gender)
{
strcpy_s(m_name, name);
m_gender = gender;
cout << "Person类构造函数被调用!" << endl;
}
~Person()
{
cout << "Person类析构函数被调用!" << endl;
}
protected:
char m_name[20];
bool m_gender;
};
class Student :public Person
{
public:
Student(char* sno, char* name, bool gender, char* major) :Person(name, gender)
{
strcpy_s(m_sno, sno);
strcpy_s(m_major, major);
cout << "Student类构造函数被调用!" << endl;
}
~Student()
{
cout << "Student类析构函数被调用!" << endl;
}
private:
char m_sno[8];
char m_major[20];
};
int main()
{
Student student("1210101", "", true, "计算机应用");
}
总结
以上就是今天记录的内容,本文仅仅简单介绍了类的继承、访问控制及派生类的概念。