目录
继承基本概念
编程示例
1.基类(父类)Person
代码特点说明
权限对类的影响
编辑
编程示例
1. 公有继承 (public inheritance)
2. 保护继承 (protected inheritance)
3. 私有继承 (private inheritance)
重要规则
实际应用
继承基本概念
继承是面向对象编程(OOP)中的一个核心概念,特别是在C++中。它允许一个类(称为派生类或子类)继承另一个类(称为基类或父类)的属性和方法。继承的主要目的是实现代码重用,以及建立一种类型之间的层次关系。
特点
1. 代码重用:子类继承了父类的属性和方法,减少了代码的重复编写。
2. 扩展性:子类可以扩展父类的功能,添加新的属性和方法,或者重写(覆盖)现有的方法(属性不能被重写或覆盖)。
3. 多态性:通过继承和虚函数,C++支持多态,允许在运行时决定调用哪个函数。
编程示例
C++中类的继承机制,定义了一个基类(Person)和两个派生类(Student和Teacher)。
基类(父类)Person
以下使用一个编程案例体验一下继承,如有一个 Person(表示人的基本信息)类,包含两个成员变量:name 和 age。创建两个 Student 和 Teacher 类,分别表示学生和老师。众所周知,不管是老师还是学生都是人,都有名字和年龄。如果给这两个类都声明成员变量: name 和 age ,就会显得繁琐,这里就可以使用继承,将 Person 作为父类,Student 和 Teacher 作为子类并且用公有权限继承 Person(父类),使 Student 和 Teacher 可以使用 Person 类里的成员变量,减少代码的重复编写。
#include <iostream>
#include <string>
using namespace std; // 使用标准命名空间
// 基类(父类)Person - 表示人的基本信息
class Person
{
public: // 公有访问权限
string name; // 姓名属性
int age; // 年龄属性
};
// 派生类(子类)Student - 继承自Person类,表示学生
class Student : public Person // 公有继承方式
{
public:
string occupation; // 学生特有的职业属性
// 打印学生信息的方法
void printfStudentMsg()
{
// 可以访问从Person继承的name和age,以及自身的occupation
cout << "职业:" << occupation << ",姓名:" << name
<< ",年龄:" << age << endl;
}
};
// 派生类(子类)Teacher - 继承自Person类,表示教师
class Teacher : public Person // 公有继承方式
{
public:
string occupation; // 教师特有的职业属性
// 打印教师信息的方法
void printfTeacherMsg()
{
// 可以访问从Person继承的name和age,以及自身的occupation
cout << "职业:" << occupation << ",姓名:" << name
<< ",年龄:" << age << endl;
}
};
int main()
{
// 创建Student对象
Student stu;
// 设置学生属性
stu.name = "李白"; // 设置继承自Person的name属性
stu.age = 18; // 设置继承自Person的age属性
stu.occupation = "学生"; // 设置Student特有的occupation属性
stu.printfStudentMsg(); // 调用Student的打印方法
// 创建Teacher对象
Teacher t;
// 设置教师属性(修正了原始代码中的错误赋值)
t.name = "张三"; // 设置继承自Person的name属性
t.occupation = "教师"; // 设置Teacher特有的occupation属性
t.age = 26; // 设置继承自Person的age属性
t.printfTeacherMsg(); // 调用Teacher的打印方法
return 0;
}
代码特点说明
-
继承关系:
-
Person
是基类,包含人的基本属性(name和age) -
Student
和Teacher
是派生类,通过公有继承(public Person
)获得Person的所有public成员
-
-
派生类特点:
-
继承了基类的所有public成员(name和age)
-
添加了自己的特有成员(occupation)
-
定义了自己的成员函数(printfStudentMsg和printfTeacherMsg)
-
-
公有继承(public inheritance)特点:
-
基类的public成员在派生类中仍然是public
-
基类的protected成员在派生类中仍然是protected
-
基类的private成员在派生类中不可直接访问
-
权限对类的影响
在C++中,访问控制符对继承的影响可以通过下表来清晰地展示。这个表格展示了不同类型的继承( public 、 protected 、 private )如何影响基类的不同类型成员( public 、 protected 、private )在派生类中的访问级别。
解释:
public 继承:基类的 public 成员在派生类中仍然是 public 的, protected 成员仍然是 protected 的。基类的 private 成员在派生类中不可访问。
protected 继承:基类的 public 和 protected 成员在派生类中都变成 protected 的。基类的 private 成员在派生类中不可访问。
private 继承:基类的 public 和 protected 成员在派生类中都变成 private 的。基类的 private 成员在派生类中不可访问。
这个表格提供了一个快速参考,帮助理解在不同类型的继承中基类成员的访问级别是如何变化的。记住,无论继承类型如何,基类的 private 成员始终不可直接在派生类中访问。
访问权限回顾
编程示例
#include <iostream>
using namespace std;
//基类,父类
class Vehicle{ //交通工具,车,抽象的概念
public:
string type;
string contry;
string color;
double price;
int numOfWheel;
protected:
int protectedData;
private:
int privateData;
public:
void run(){
cout << "车跑起来了" << endl;
}
void stop();
};
//私有继承测试
class TestClass : private Vehicle{
public:
void tsetFunc(){
price = 10; //基类的公有数据被私有继承后,在派生类中权限编程私有,只限在类内部使用
}
};
//公有继承测试
class Truck : protected Vehicle{
public:
void testFunc(){
type = "数据测试"; //保持私有权限
protectedData = 10; //保持私有权限
privateData = 10; //报错了,基类的私有成员,不管哪种方式的继承都是不可访问的。
}
};
//公有继承,基类的公有权限和保护权限不变,私有成员不能访问
class Bickle : public Vehicle{
public:
void testFunc(){
protectedData = 10;
}
};
//派生类,子类
class Roadster : public Vehicle{ //跑车,也是抽象,比父类感觉上范围缩小了点
public:
int stateOfTop;
void openTopped();
void pdrifting();
};
int main()
{
TestClass test;
test.price = 3.3; //报错了,基类的公有成员被私有继承后,降为私有权限
Truck t;
t.type = "测试"; //报错了,基类的公有成员被保护继承后,降为保护权限
t.protectedData = 10; //从报错信息看出,保护继承造成基类的保护成员还是保持保护权限
Roadster ftype;
ftype.type = "捷豹Ftype";
ftype.run();
Bickle bike;
bike.type = "死飞";
bike.run();
return 0;
}
1. 公有继承 (public inheritance)
class Roadster : public Vehicle
class Bickle : public Vehicle
特点:
-
基类的public成员在派生类中保持public
-
基类的protected成员在派生类中保持protected
-
基类的private成员在派生类中不可访问
例子中Bickle
类的testFunc()
可以访问基类的protected成员protectedData
。
2. 保护继承 (protected inheritance)
class Truck : protected Vehicle
特点:
-
基类的public和protected成员在派生类中都变为protected
-
基类的private成员在派生类中不可访问
所以在Truck
类外部:
Truck t;
t.type = "测试"; // 错误,type现在是protected
t.protectedData = 10; // 错误,protected成员不能在类外访问
3. 私有继承 (private inheritance)
class TestClass : private Vehicle
特点:
-
基类的public和protected成员在派生类中都变为private
-
基类的private成员在派生类中不可访问
所以在TestClass
类外部:
TestClass test;
test.price = 3.3; // 错误,price现在是private
重要规则
-
无论哪种继承方式,基类的private成员在派生类中都不可直接访问
-
继承方式决定了基类成员在派生类中的访问权限:
-
公有继承:保持原权限
-
保护继承:public→protected
-
私有继承:public/protected→private
-
实际应用
-
公有继承是最常用的,表示"是一个"的关系
-
保护继承和私有继承较少使用,通常用于实现细节的隐藏
-
在派生类内部,可以访问基类的public和protected成员(取决于继承方式)