C++_ C++11的override和final
1. override 关键字
用于明确表示派生类中的某个虚函数是用来重写基类中的虚函数的,这样编译器会检查基类,看看是否确实存在同样的虚函数,如果没有匹配,假设比对后发现参数类型、返回类型不同,会报错。
这样有效防止了因为函数签名(原型)不一致带来的意外行为。
以下例子中,print() 的参数类型不匹配,在VISUALSTUDIO2022 直接红色波浪线,在编译期即可检查出来
因此,明示函数是重写的而非新定义的,增加了代码的清晰度和可维护性。
class Base
{
public:
virtual void show() const
{
cout << "Base::show" << endl;
}
virtual void print(int x)const
{
cout << "Base::print" << x << endl;
}
};
class Derived :public Base
{
public:
void show() const override // 正确重写
{
cout << "Derived::show" << endl;
}
void print(double x)const override // 错误重写,参数类型不匹配
{
cout << "Derived::print" << x << endl;
}
};
2. final 关键字
final 可以用在虚函数和类上:
- 在虚函数上使用 final,表示该函数在派生类中不能进一步被重写
- 在类上使用 final , 表示该类不能被继承,防止进一步派生
如果在设计时,对于某些类或者虚函数不希望被进一步扩展或重写,可以用 final
强制该约束,避免不安全行为
在虚函数上使用 final
class Base
{
public:
virtual void show() const {
cout << "Base::show" << endl;
}
};
class Derived : public Base
{
public:
void show() const final // 使用 final 禁止进一步重写
{
cout << "Derived::show" << endl;
}
};
class MoreDerived : public Derived
{
public:
void show() const override // 错误:不能重写 final 函数
{
cout << "MoreDerived::show" << endl;
}
};
Derived::show()
被标记为 final
,MoreDerived 试图重写它,带来编译错误
在类上使用 final
class Base final // 使用 final 表示该类不能被继承
{
public:
void display() const
{
cout << "Base::display" << endl;
}
};
class Derived : public Base // 出现编译错误:无法继承 final 类
{
};
函数标记 final 后,编译器可以进行优化,因为它知道该函数不会被进一步重写,适用于需要明确终止继承链的类和函数的时候
原文地址:https://blog.csdn.net/dotdotyy/article/details/143649562
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!