在 C++ 中,继承是面向对象编程的一个核心概念,它允许一个类(称为派生类或子类)继承另一个类(称为基类或父类)的成员变量和成员函数。继承机制使得可以重用已有代码,并促进了代码的模块化。通过继承,派生类可以扩展或修改基类的行为。
继承的类型
C++ 支持几种类型的继承:
-
公有继承(Public):最常用的继承类型。公有继承意味着基类的公有成员和保护成员的访问属性在派生类中保持不变,但基类的私有成员不能直接被派生类访问。
-
保护继承(Protected):基类的公有和保护成员在派生类中成为保护成员。
-
私有继承(Private):基类的公有和保护成员在派生类中成为私有成员。
基本概念
- 基类(Base Class):被继承的类,提供了一些基本功能。
- 派生类(Derived Class):从基类继承,并可能添加新功能或覆盖现有功能的类。
继承的语法
class Base {
public:
void show() {
std::cout << "Base class show function called." << std::endl;
}
};
class Derived : public Base {
public:
void show() {
std::cout << "Derived class show function called." << std::endl;
}
};
在这个例子中,Derived
类继承了 Base
类。Derived
类的对象可以使用 Base
类的成员,除非这些成员是私有的。
##访问控制和继承
- 公有成员(Public):可以被任何外部代码访问。
- 保护成员(Protected):不能被外部代码访问,但可以被派生类访问。
- 私有成员(Private):不能被派生类访问,只能被基类自己的成员函数和友元函数访问。
覆盖成员函数
派生类可以定义一个与基类同名的成员函数,这通常称为“覆盖”或“重写”。在上面的例子中,派生类 Derived
重写了基类 Base
的 show()
函数。
使用 virtual
关键字
如果基类的成员函数被声明为 virtual
,则派生类可以重写这个函数,并且即使通过基类的指针或引用调用这个函数,也会执行派生类的版本。这种机制称为“多态”。
class Base {
public:
virtual void show() {
std::cout << "Base class show function called." << std::endl;
}
};
class Derived : public Base {
public:
void show() override { // 使用 override 是 C++11 引入的好实践
std::cout << "Derived class show function called." << std::endl;
}
};
Base* b = new Derived();
b->show(); // 输出:Derived class show function called.
delete b;
构造函数和析构函数
构造函数和析构函数在继承中也有特殊的行为:
- 当创建派生类的对象时,首先调用基类的构造函数,然后是派生类的构造函数。
- 当对象被销毁时,先调用派生类的析构函数,然后是基类的析构函数。
继承使得 C++ 强大而灵活,支持复杂的对象模型和代码重用,但同时也需要仔细设计,以避免如继承层次过深、多重继承可能引起的问题等复杂性。