24-6 为派生类添加新功能
在继承课程的导言中,我们提到使用派生类最大的优势之一在于能够复用已编写的代码。你可以继承基类的功能,然后添加新功能、修改现有功能,或隐藏不需要的功能。在本课及后续几课中,我们将深入探讨如何实现这些操作。
首先,让我们从一个简单的基类开始:
#include <iostream>
class Base
{
protected:
int m_value {};
public:
Base(int value)
: m_value { value }
{
}
void identify() const { std::cout << "I am a Base\n"; }
};
现在,让我们创建一个从基类继承的派生类。由于我们希望派生类能在派生对象实例化时设置 m_value 的值,因此将在派生类的构造函数初始化列表中调用基类的构造函数。
class Derived: public Base
{
public:
Derived(int value)
: Base { value }
{
}
};
为派生类添加新功能
在上例中,由于我们能够访问基类的源代码,因此可以直接在基类中添加所需功能。
有时我们虽能访问基类却不愿修改它。例如当您刚从第三方供应商购入代码库,却需要额外功能时。虽然可以直接修改原始代码,但这并非最佳方案。若供应商发布更新版本,你的修改要么被覆盖,要么需手动迁移至新版本——既耗时又存在风险。
更常见的是根本无法修改基类的情况,例如标准库中的代码。我们无法修改标准库中的代码,但可以继承这些类,并在派生类中添加自定义功能。第三方库同样如此——它们提供头文件但代码已预编译。
无论哪种情况,最佳方案都是创建派生类,并在其中添加所需功能。
基类明显缺少的是让公共访问 m_value 的方式。我们可以在基类中添加访问函数来弥补——但为了示例目的,我们将改为在派生类中添加。由于 m_value 在基类中被声明为受保护,派生类可以直接访问它。
要为派生类添加新功能,只需像往常一样在派生类中声明该功能:
class Derived: public Base
{
public:
Derived(int value)
: Base { value }
{
}
int getValue() const { return m_value; }
};
现在,公众将能够对类型为Derived的对象调用getValue()方法来访问m_value的值。
int main()
{
Derived derived { 5 };
std::cout << "derived has value " << derived.getValue() << '\n';
return 0;
}
这产生了以下结果:

虽然这可能显而易见,但基类(Base)的对象无法访问派生类(Derived)中的getValue()函数。以下代码无法正常工作:
int main()
{
Base base { 5 };
std::cout << "base has value " << base.getValue() << '\n';
return 0;
}
这是因为基类中不存在 getValue() 函数。该函数属于派生类。由于派生类继承自基类,因此它可以访问基类中的内容。然而,基类无法访问派生类中的任何内容。


浙公网安备 33010602011771号