一.override和final介绍
在C++11中,override和final是两个用于支持继承和多态的重要关键字。它们的具体作用如下:
- override:这个关键字用于派生类中,以确保虚函数的正确重写。当一个派生类的函数被声明为override时,编译器会检查该函数是否正确地重写了基类中的虚函数。如果签名不匹配,则编译器会报错。这有助于避免由于函数签名错误而导致的继承错误,提高代码的安全性和可读性。
- final:这个关键字有两个主要的用途。首先,它可以阻止一个类被进一步继承,即使用final修饰的类不能有派生类。其次,它也可以阻止虚函数在派生类中被进一步重写。使用final修饰的虚函数在派生类中不能有对应的重载版本。这有助于保护基类的设计,防止子类对继承关系进行不必要的修改或滥用。
二.使用override和final关键字使用示例:
(1)override关键字使用示例:
#include <iostream>
class Base {
public:
virtual void foo() {
std::cout << "Base::foo()" << std::endl;
}
};
class Derived1 : public Base {
public:
void foo1() override {
std::cout << "Derived1::foo()" << std::endl;
}
};
int main() {
Derived1 d1;
d1.foo(); // 输cDerived1::foo()
return 0;
}
运行结果:
Derived1
类继承自Base
类,并重写了foo()
函数。在重写的函数前使用了override
关键字,这告诉编译器该函数是覆盖基类中的虚函数。如果函数签名不匹配,编译器会报错。
(2)override和final关键字同时使用示例:
#include <iostream>
class Base {
public:
virtual void foo() final {
std::cout << "Base::foo()" << std::endl;
}
};
class Derived1 : public Base {
public:
void foo() override {
std::cout << "Derived1::foo()" << std::endl;
}
};
// 无法继承自Base类,因为Base类中的foo()函数被声明为final
// class Derived2 : public Base {
// public:
// void bar() override {
// std::cout << "Derived2::bar()" << std::endl;
// }
// };
int main() {
Derived1 d1;
d1.foo(); // 输出:Derived1::foo()
return 0;
}
运行结果:
在上面的示例中,
Base
类定义了一个虚函数foo()
,并使用final
关键字修饰它。这意味着Base
类不能有派生类,并且foo()
函数在派生类中也不能被重写。由于
Base
类中的foo()
函数被声明为final
,所以无法创建Derived2
类来继承Base
类。如果尝试这样做,编译器会报错。这个示例演示了如何使用
override
和final
关键字来指示函数覆盖和阻止进一步的派生类覆盖。