【现代C++】显式虚函数重载

在这里插入图片描述

现代C++中的显式虚函数重载是通过overridefinal关键字实现的,这两个关键字提高了代码的清晰度和安全性。override确保子类中的函数确实重写了基类中的虚函数,而final则防止进一步的重写。这些关键字帮助捕获编程时的错误,如拼写错误或不匹配的函数签名。

1. 使用override显式声明重写

使用override关键字可以显式地指明一个成员函数重写了基类的虚函数。如果标记为override的函数没有匹配基类的虚函数,编译器将报错。

#include <iostream>

class Base {
public:
    virtual void func() {
        std::cout << "Base function" << std::endl;
    }
};

class Derived : public Base {
public:
    void func() override {  // 明确表示这个函数是重写的
        std::cout << "Derived function" << std::endl;
    }
};

void useOverride() {
    Derived d;
    d.func();  // 输出: Derived function
}

2. 使用final阻止进一步的重写

final关键字可以阻止继承类重写特定的虚函数。如果尝试重写标记为final的函数,编译器将报错。

#include <iostream>

class Base {
public:
    virtual void func() final {  // 阻止进一步重写该函数
        std::cout << "Base function" << std::endl;
    }
};

class Derived : public Base {
public:
    // void func() override {  // 尝试重写,将引发编译错误
    //     std::cout << "Derived function" << std::endl;
    // }
};

void useFinal() {
    Base b;
    b.func();  // 输出: Base function
}

3. 类级别的final使用

final关键字不仅可以用于虚函数,还可以用于类。如果一个类被标记为final,它不能被继承。

class Base final {  // 标记为final,阻止进一步继承
public:
    virtual void func() {
        std::cout << "Base function" << std::endl;
    }
};

// class Derived : public Base {  // 尝试继承Base,将引发编译错误
// public:
//     void func() override {
//         std::cout << "Derived function" << std::endl;
//     }
// };

void useClassFinal() {
    Base b;
    b.func();  // 输出: Base function
}

4. override和构造函数

需要注意的是,构造函数不能被标记为override,因为构造函数不是可以被继承的成员函数。

class Base {
public:
    virtual void func() {
        std::cout << "Base function" << std::endl;
    }
};

class Derived : public Base {
public:
    // Derived() override { }  // 错误: 构造函数不能被标记为override
    void func() override {
        std::cout << "Derived function" << std::endl;
    }
};

void constructorOverride() {
    Derived d;
    d.func();  // 输出: Derived function
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值