C++编程语言中,final和override是两个重要的关键字,它们用于增强类的继承和多态机制。我们就可以使用这两个关键字来帮助我们实现这些功能,这两个关键字在C++11标准中被引入。
一、Final 关键字
1. 作用
final关键字用于标识一个类或成员函数,表示它不能被继承或覆盖。当应用于类时,它指示该类不能被其他类继承。当应用于成员函数时,它指示该函数不能在派生类中被覆盖。
2.使用方法
(1) 类的用法
当final关键字用于类时,表示该类不能被继承。
class Base final {
// 类Base不能被继承
};
(2) 成员函数的用法
当final关键字用于成员函数时,表示该函数不能在派生类中被覆盖。
class Base {
public:
virtual void func() final {
// func函数不能在派生类中被覆盖
}
};
(3) final的使用示例
class Base final {
public:
virtual void func() final {
std::cout << "Base::func()" << std::endl;
}
};
// 错误:无法从final类Base继承
class Derived : public Base {
// 错误:无法覆盖final函数func()
// virtual void func() override {
// std::cout << "Derived::func()" << std::endl;
// }
};
int main() {
Base base;
base.func();
return 0;
}
在这个示例中,类Base被标记为final,因此不能被其他类继承。同样,成员函数func()也被标记为final,因此不能在派生类中被覆盖。
二、C++ Override 关键字
1.作用
override关键字用于明确指出派生类中的成员函数旨在覆盖基类中的同名虚拟函数。这有助于编译器检查派生类中的函数是否确实覆盖了基类中的函数,从而提高了代码的可靠性和可维护性。
2.使用方法
override关键字只能用于派生类中的成员函数,并且该函数必须覆盖基类中的同名虚拟函数。
class Base {
public:
virtual void func() {
std::cout << "Base::func()" << std::endl;
}
};
class Derived : public Base {
public:
void func() override {
std::cout << "Derived::func()" << std::endl;
}
};
override的使用示例:
class Base {
public:
virtual void func() {
std::cout << "Base::func()" << std::endl;
}
};
class Derived : public Base {
public:
void func() override {
std::cout << "Derived::func()" << std::endl;
}
};
int main() {
Base* basePtr = new Derived();
basePtr->func(); // 输出:Derived::func()
delete basePtr;
return 0;
}
在这个示例中,派生类Derived中的func()函数使用了override关键字,明确表示它旨在覆盖基类Base中的同名虚拟函数。这有助于编译器检查func()函数是否确实覆盖了基类中的函数。
三、final和override的联合使用
在实际编程中,我们可以同时使用final和override关键字来实现更严格的类继承和虚函数重写控制。例如:
class Base {
public:
virtual void func() {}
};
class Derived : public Base {
public:
void func() final override { // 正确重写了Base::func(),并且禁止进一步重写
// ...
}
};
class WrongDerived : public Derived {
public:
void func() override { // 编译错误,Derived::func()已经禁止重写
// ...
}
};
总结
final和override是C++11标准引入的两个关键字,它们为类的继承和多态机制提供了更多的控制权和明确性。final关键字用于指示一个类或成员函数不能被继承或覆盖,而override关键字用于明确指出派生类中的成员函数旨在覆盖基类中的同名虚拟函数。
通过对final和override关键字的理解和运用,我们可以更加安全、清晰地设计和实现C++程序。