一、继承与派生:面向对象的基石
在 C++ 的编程世界中,继承与派生机制就像是一座大厦的基石,为面向对象编程(OOP)奠定了坚实基础。它们不仅是代码复用的关键手段,更是构建复杂软件系统的强大工具。
继承,简单来说,就是一个类(派生类)可以获取另一个类(基类)的属性和方法。这一机制与现实生活中的继承概念类似,比如子女继承父母的某些特征。在 C++ 里,通过继承,开发者无需从头开始编写代码,就能快速构建具有丰富功能的新类。例如,我们定义一个 “Person” 类作为基类,其中包含 “name”(姓名)和 “age”(年龄)等基本属性:
TypeScript
取消自动换行复制
classPerson {
public:
string name;
int age;
voiddisplayInfo() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};
然后,我们可以派生出 “Student” 类,它不仅拥有 “Person” 类的所有属性和方法,还能新增属于自己的独特属性,如 “studentID”(学号)和 “grades”(成绩):
TypeScript
取消自动换行复制
classStudent : publicPerson {
public:
string studentID;
map<string, double> grades;
voiddisplayStudentInfo() {
displayInfo();
cout << "Student ID: " << studentID << endl;
cout << "Grades: ";
for (const auto& grade : grades) {
cout << grade.first << ": " << grade.second << ", ";
}
cout << endl;
}
};
在这个例子中,“Student” 类通过 “public” 关键字继承了 “Person” 类,这是一种公有继承方式。公有继承的特点是基类的公有成员和保护成员在派生类中保持原有的访问权限,而基类的私有成员在派生类中仍然是私有的,无法直接访问,但依然被继承下来。
派生类除了继承基类的成员,还可以定义自己的新成员函数和变量,以满足特定的需求。比如 “Student” 类中的 “displayStudentInfo” 函数,它不仅调用了基类的 “displayInfo” 函数来显示基本信息,还输出了学生特有的学号和成绩信息 。这种在继承基础上的功能扩展,使得代码具有更好的层次性和可维护性。
二、三种继承方式:权限控制的艺术
C++ 提供了三种继承方式,每种方式都有其独特的访问控制规则,就像是为基类成员在派生类中的访问权限设置了不同的 “密码锁”。这三种继承方式分别是:公有继承(public)、私有继承(private)和保护继承(protected) 。下面,我们将深入探讨它们的奥秘。
(一)公有继承(public):最开放的传承
公有继承是最常用的继承方式,就像家族中公开传承的技艺,所有人都能看到和使用。在公有继承中,基类的公有成员和保护成员在派生类中保持原有的访问权限。这意味着派生类可以直接使用基类的公有成员,外部代码通过派生类对象也能访问这些公有成员。
我们以之前的 “Person” 和 “Student” 类为例,“Student” 类通过公有继承 “Person” 类:
TypeScript
取消自动换行复制
classPerson {
public:
string name;
int age;
voiddisplayInfo() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};
classStudent : publicPerson {
public:
string studentID;
map<string, double> grades;
voiddisplayStudentInfo() {
displayInfo();
cout << "Student ID: " << studentID << endl;
cout << "Grades: ";
for (const auto& grade : grades) {
cout << grade.first << ": " << grade.second << ", ";
}
cout << endl;
}
};
在这段代码中,“Student” 类可以直接调用 “Person” 类的 “displayInfo” 公有函数,并且外部代码也可以通过 “Student” 类的对象访问 “name” 和 “age” 公有成员:
TypeScript
取消自动换行复制
int main() {
Student stu;
stu.name = "Alice";
stu.age = 20;
stu.studentID = "S001";
stu.grades["Math"] = 95.0;
stu.displayInfo();
stu.displayStudentInfo();
return;
}
1月26日,记者从广期所获悉,为巩固产业的国际竞争地位,服务制造强国建设,增强绿...
北京时间2025年4月6日晚,大连英博在中超第5轮的比赛中,客场挑战成都蓉城。上...
AI基金长信企业精选两年定开混合(005589)披露2025年年报,2025年基...
中新网6月12日电综合报道,当地时间6月11日,美国俄亥俄州文顿县一工厂发生化学...
Powered by 亚美体育app官方入口手机版 RSS地图 HTML地图
Copyright Powered by365建站 © 2013-2024