推荐答案
测试一下
题目
编写相应的类对基类进行覆盖。
参考答案与知识点
参考答案
该题考察面向对象编程中的覆盖(override)机制,即派生类重新定义基类的虚函数。覆盖要求函数签名(名称、参数类型、个数、const/volatile限定)必须完全一致,并且基类函数必须声明为virtual。若签名不一致则成为隐藏(hide)而非覆盖。在C++中,推荐使用override关键字显式标记,以便编译器检查。示例:
// 基类
class Shape {
public:
virtual double area() const { return 0; }
virtual ~Shape() = default;
};
// 派生类覆盖
class Circle : public Shape {
private:
double r;
public:
Circle(double radius) : r(radius) {}
double area() const override { return 3.14 * r * r; }
};
易错点:1) 忘记在基类加virtual,导致静态绑定而非动态绑定;2) 参数或const不一致,造成隐藏;3) 析构函数未声明virtual导致派生类对象析构不完整。在SystemVerilog中语法类似:基类函数用virtual,派生类用virtual function ... override;。若基类函数是纯虚(pure virtual),则派生类必须覆盖,否则派生类也成为抽象类。覆盖是实现多态的基础,通过基类指针或引用调用同名函数时可以执行派生类版本。
涉及知识点
- 覆盖(override)的定义与条件
- virtual关键字的作用
- override关键字与编译器检查
- 隐藏(hide)与覆盖的区别
- 多态的实现(动态绑定)
- 虚析构函数的重要性