跳转到主要内容
模块 6 · 第 2 课(共 2)课程中的14/18~15 min
模块课程(2/2)

多态性和虚函数

多态性允许我们通过对基类的指针或引用来处理不同派生类的对象,确保在运行时调用正确版本的方法(后期绑定)。

虚拟函数:virtual 和 override

要在方法上启用多态性,我们必须使用基类中的 virtual 关键字来声明它。在派生类中,我们使用 override 说明符来明确声明我们正在重写该方法。

C++
class Employee {
public:
    virtual void work() {
        std::cout << "Generic work" << std::endl;
    }
    // IMPORTANT: Virtual destructor in base class to avoid memory leaks
    virtual ~Employee() = default;
};

class Developer : public Employee {
public:
    void work() override {
        std::cout << "Writing C++ code" << std::endl;
    }
};

使用指向基类的指针,C++ 将在运行时解析正确的方法:

C++
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;

抽象类和纯虚函数

纯虚函数是在末尾以 = 0 声明的虚拟成员函数。它代表了一个正式的契约:基类不提供任何实现,而是将其完全委托给子类。

至少包含一个纯虚函数的类称为抽象类,不能直接实例化。

C++
class Instrument {
public:
    virtual void play() = 0; // Pure virtual
    virtual ~Instrument() = default;
};

class Piano : public Instrument {
public:
    void play() override {
        std::cout << "Playing piano..." << std::endl;
    }
};

自己尝试一下

锻炼#cpp.m6.l2.e1
尝试:0加载中...

在 Animal 中定义一个虚拟方法 makeSound() 来打印“Some sound”。然后使用覆盖说明符在 Cat 类中覆盖它以打印“Meow”。

正在加载编辑器...
显示提示

请记住在基类方法前面添加“virtual”,并在派生类中的参数括号后面放置“override”。

3 次尝试后可用的解决方案

锻炼#cpp.m6.l2.e2
尝试:0加载中...

在抽象类 Printable 中声明一个返回 void 的纯虚函数 print()。然后创建公开继承自Printable的Document类,并实现print()方法来打印“打印文档”。

正在加载编辑器...
显示提示

纯虚函数是用签名“virtual void print() = 0;”声明的。确保“Document”公开继承自“Printable”。

3 次尝试后可用的解决方案