您现在的位置是:首页 >技术交流 >C/C++ 知识点:override、final和overload网站首页技术交流
C/C++ 知识点:override、final和overload
简介C/C++ 知识点:override、final和overload
一、override、final和overload
1.1、虚函数常见错误
虚函数的两个常见错误:无意的重写、虚函数签名不匹配。无意的重写示例如下,在派生类中声明了一个与基类的某个虚函数具有相同的签名的成员函数,不小心重写了这个虚函数。
错误一:无意义的重写
class Base {
public:
virtual void Show(); // 虚函数
};
class Derived : public Base {
public:
void Show(); // 无意的重写
};
错误二:虚函数签名不匹配
函数的签名包括:函数名,参数列表,const属性。虚函数签名不匹配的错误通常是因为 函数名、参数列表 或 const 属性不一样,导致意外创建了一个新的虚函数,而不是重写一个已存在的虚函数。
class Base {
public:
virtual void Show(int x); // 虚函数
};
class Derived : public Base {
public:
virtual void Sh0w(int x); // o 写成了 0,新的虚函数
virtual void Show(double x); // 参数列表不一样,新的虚函数
virtual void Show(int x) const; // const 属性不一样,新的虚函数
};
上述三种写法,编译器并不会报错,因为它不知道你的目的是重写虚函数,而是把它当成了新的虚函数。
1.2、override与final
针对上述情况,C++ 11 增加了两个继承控制关键字:override 和 final,两者的作用分别为:
- override:保证在派生类中声明的重载函数,与基类的虚函数有相同的签名
- final:阻止类的进一步派生和虚函数的进一步重写
1.2.1、override
比如下面的代码,加了override,明确表示派生类的这个虚函数是重写基类的,如果派生类与基类虚函数的签名不一致,编译器就会报错,下面的代码在实际的编译过程会报错,如下:
class Base {
public:
virtual void Show(int x); // 虚函数
};
class Derived : public Base {
public:
virtual void Show(int x) const override; // const 属性不一样,新的虚函数,编译时会报错
};
因此,为了减少程序运行时的错误,重写的虚函数都建议加上 override。
1.2.2、final
如果不希望某个类被继承,或不希望某个虚函数被重写,则可以在类名和虚函数后加上 final 关键字,加上 final 关键字后,再被继承或重写,编译器就会报错。如下:
class Base {
public:
virtual void Show(int x) final; // 虚函数
};
class Derived : public Base {
public:
virtual void Show(int x) override; // 重写final虚函数,编译时会报错
};
因此,一旦一个虚函数被声明为final,则派生类不能再重写它。
1.3、override与overload区别
1.3.1、overload
重载指的是函数具有相同的函数名,不同的参数列表或const属性。类中的成员函数const属性不同也可以重载,如下:
class base {
public:
void show(string &str);
void show(string &str) const; // 参数列表相同,const属性不同也可以进行重载
};
1.3.2、override与overload区别
下面是overload与override之间的区别,如下:
overload | override | |
---|---|---|
概念 | 重载指的是函数具有的不同的参数列表,而函数名相同的函数 | 保证在派生类中声明的重载函数,与基类的虚函数有相同的签名 |
使用场景 | 同一个类中,同名的不同成员函数之间 | 派生类虚函数,覆盖基类虚函数 |
注意:覆盖要求函数名,参数列表、返回值、const属性都相同
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。