C++ -- override 关键字

override 作用

override 是 C++11 引入的一个关键字,用于显式地声明派生类中的虚函数重写了基类的某个虚函数。
1.告知编译器和阅读代码的人,该函数旨在重写基类的一个虚函数。
2.如果基类没有对应的可重写虚函数,或者函数签名不完全匹配,编译器将直接报错,阻止潜在的隐藏错误。
示例代码:

#include <iostream>

class Base
{
public:
    Base() = default;
    ~Base() = default;

    virtual void func()
    {
        std::cout << "Base func." << std::endl;
    }
};

class Derived : public Base
{
public:
    Derived() = default;
    ~Derived() = default;

    void func() override
    {
        std::cout << "Derived func." << std::endl;
    }
};

int main()
{
    Base *b = new Derived();
    b->func();
    return 0;
}

上述代码的输出是Derived func. 我们定义的指针对象 b 的静态类型是Base*,动态类型是Derived*,在运行时根据其动态类型调用了Derived类中的成员函数。

能否不使用 override

答案是可以的,override 本身不影响代码逻辑的实现。
C++中虚函数重写的规则:只要函数签名相同,基类函数是虚的,派生类定义就会重写,无论是否使用override关键字。override只是显式声明,让编译器检查是否真的重写了基类虚函数,如果不匹配则报错。
测试程序如下:

#include <iostream>

class Base
{
public:
    Base() = default;
    ~Base() = default;

    virtual void func()
    {
        std::cout << "Base func." << std::endl;
    }
};

class Derived : public Base
{
public:
    Derived() = default;
    ~Derived() = default;

    void func()
    {
        std::cout << "Derived func." << std::endl;
    }
};

int main()
{
    Base *b = new Derived();
    b->func();
    return 0;
}

我们删掉了override关键字,代码的输出依然是Derived func.
但是在实际开发中为了提高代码的可维护性以及可读性,更规范地开发仍需要使用override关键字。
【这个问题面试的时候没有回答上,真悲伤....】

隐藏基类函数的情况

该小节与 override 关键字无关,只是一起整理了。
若派生类有与基类的同名函数,参数列表不同,将会隐藏基类的函数。即派生类中无法查到到基类中被隐藏的函数。

#include <iostream>

class Base
{
public:
    Base() = default;
    ~Base() = default;

    virtual void func()
    {
        std::cout << "Base func." << std::endl;
    }
};

class Derived : public Base
{
public:
    Derived() = default;
    ~Derived() = default;

    void func(int a) // 重载版本
    {
        std::cout << "Derived overload." << std::endl;
    }
};

int main()
{
    Derived *d = new Derived();
    d->func();     // 会报错,因为基类的func()被隐藏了
    d->func(3);
    return 0;
}

上述代码d->func();会出现报错,因为基类的func()函数被隐藏了。

posted @ 2026-02-12 00:06  奋斗的小仔  阅读(8)  评论(0)    收藏  举报