覆盖override和隐藏hide

覆盖

#include <iostream>

// 基类
class Base {
public:
    virtual void display() {  // 基类虚函数
        std::cout << "Base class display" << std::endl;
    }
};

// 派生类
class Derived : public Base {
public:
    void display() {  // 未使用 override,但覆盖基类虚函数
        std::cout << "Derived class display" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();  // 基类指针指向派生类对象
    basePtr->display();  // 调用派生类覆盖的函数
    delete basePtr;
    return 0;
}

子类中如果函数签名(函数名,参数)与基类的虚函数匹配上,就会在基类的名称空间执行覆盖。

使用 override 校验

类似于java的@overWrite,明确告诉编译器是覆盖基类虚函数,如果签名没匹配上,会报错

// 基类
class Base {
public:
    virtual void display() {  // 基类虚函数
        std::cout << "Base class display" << std::endl;
    }
};

// 派生类
class Derived : public Base {
public:
    void display() override {  // 使用 override 关键字
        std::cout << "Derived class display" << std::endl;
    }
};

隐藏

#include <iostream>

// 基类
class Base {
public:
    void display(int x) {  // 基类函数
        std::cout << "Base class display with int: "<< x << std::endl;
    }
};

// 派生类
class Derived : public Base {
public:
    void display() {  // 隐藏基类 display(int)
        std::cout << "Derived class display" << std::endl;
    }
};

int main() {
    Derived d;
    d.display();      // 调用 Derived 类的 display 函数
    // d.display(5);    // 错误:基类的 display(int) 被隐藏
    d.Base::display(5); // 通过作用域解析显式调用基类函数
    return 0;
}

如果函数匹配不到基类的虚函数签名,就会新生成子类的名称域对基类名称域进行隐藏,之后调用的就是这个子类名称域的函数

posted @ 2025-04-14 13:24  丘狸尾  阅读(10)  评论(0)    收藏  举报