C++ 继承机制概述(下)
C++ 继承是面向对象编程中的一个重要机制,它允许一个类(称为子类或派生类)继承另一个类(称为基类或父类)的属性和行为。这种机制的应用可以提高代码的重用性和扩展性。以下是 C++ 继承机制的一些关键概念和方面:
基本概念
基类(Base Class)和派生类(Derived Class):
- 基类是被继承的类,派生类是从基类继承而来的类。派生类拥有基类的所有非私有成员(包括数据成员和函数)。
继承方式:
- C++ 支持三种继承方式:公有继承(public)、保护继承(protected)和私有继承(private)。继承方式决定了基类成员在派生类中的访问权限。
- 公有继承:基类的公共和保护成员在派生类中保持其访问级别。
- 保护继承:基类的公共和保护成员在派生类中变为保护成员。
- 私有继承:基类的公共和保护成员在派生类中变为私有成员。
继承特点
多重继承(Multiple Inheritance):
- C++ 支持一个类从多个基类继承,这被称为多重继承。这可能导致“菱形继承”问题,通常通过虚继承来解决。
虚继承(Virtual Inheritance):
- 虚继承用于解决多重继承中的“菱形继承”问题,防止多个“虚”基类子对象的重复。
构造函数与析构函数:
- 基类的构造函数不能被继承。当创建派生类对象时,首先调用基类的构造函数,然后调用派生类的构造函数。
- 析构函数的调用顺序与构造函数相反,首先调用派生类的析构函数,然后调用基类的析构函数。
重载与重写(Overloading and Overriding):
- 派生类可以重载基类的成员函数,也可以重写(override)基类的虚函数。重写时使用
override
关键字(C++11 及以后)可以提高代码的可读性和安全性。
- 派生类可以重载基类的成员函数,也可以重写(override)基类的虚函数。重写时使用
多态性(Polymorphism):
- 基于继承和虚函数实现的多态性是 C++ 的一个重要特性,它允许程序在运行时决定调用哪一个函数。
访问控制与访问权限:
- 派生类不能访问基类的私有成员,但可以通过基类的公共或保护成员函数进行访问。
- “使用基类作为接口”的设计理念往往需要使用公有继承。
示例
class Base {
public:
void show() {
std::cout << "Base class show function called." << std::endl;
}
virtual void display() {
std::cout << "Base class display function called." << std::endl;
}
};
class Derived : public Base {
public:
void show() {
std::cout << "Derived class show function called." << std::endl;
}
void display() override {
std::cout << "Derived class display function called." << std::endl;
}
};
int main() {
Base* b;
Derived d;
b = &d;
b->show(); // 调用 Base 类的 show
b->display(); // 调用 Derived 类的 display
return 0;
}
在上述示例中,b->display()
调用了派生类 Derived
的 display
函数,因为 display
是一个虚函数,而 b
是指向 Derived
对象的 Base
类型指针。
通过理解和正确应用 C++ 的继承机制,你可以创建出复杂而灵活的对象之间的关系,使代码更具表达力,并简化程序修改和扩展的过程。