1. C++中常见的成员方法的关系
- 重载 overload : 在同一作用域下,函数名相同,参数列表不同,构成重载
- 隐藏 overhide :在继承体系中,子类中方法与父类方法的名称一样,在子类中,会将父类的同名方法隐藏
- 重写 override : 在继承体系中,子类重新实现父类的虚函数为己所用,(函数名和参数列表形同)
2. C++11中新增override关键字:增强代码可读性,显式的告诉编译器我这个方法覆盖的是子类的某个虚函数,也防止程序员疏忽
class Base {
public:
Base(int data) :ma(data) { cout << "Base(int data)" << endl; mc = data; }
~Base() { cout << "~Base()" << endl; }
virtual void show() { cout << "Base::show()" << endl; }
protected:
int ma;
int mc;
};
class Deriver :public Base {
public:
Deriver(int data) :mb(data), Base(data) { cout << "Deriver(int data)" << endl; }
~Deriver() { cout << "~Deriver()" << endl; }
//c+11前
//void show() { cout << "Deriver::show()" << endl; }
//c++11中 子类重写父类的show方法,可以加override
void show()override { cout << "Deriver::show()" << endl; }
private:
int mb;
};
这个关键字并不是强制使用的,只不过我们在开发时,使用了更好,因为能让代码的其他读者和使用者一眼就能看出来,当前这个子类的方法是重写了父类的方法,提高代码可读性,使得代码更优雅。
class Base {
public:
Base(int data) :ma(data) { cout << "Base(int data)" << endl; mc = data; }
~Base() { cout << "~Base()" << endl; }
//virtual void show() { cout << "Base::show()" << endl; }
protected:
int ma;
int mc;
};
class Deriver :public Base {
public:
Deriver(int data) :mb(data), Base(data) { cout << "Deriver(int data)" << endl; }
~Deriver() { cout << "~Deriver()" << endl; }
//c++11中 子类重写父类的show方法,可以加override
void show()override { cout << "Deriver::show()" << endl; }
private:
int mb;
};
当父类中没有可以被覆盖的show()方法时,编译器报错:“Deriver::show”: 包含重写说明符“override”的方法没有重写任何基类方法
某种意义是使得我们程序员能减少错误,能够准确的覆盖我们想覆盖的方法。
3. 总结
- 增强代码可读性,使得读者很容易知道当前方法是在重写父类方法;
- 某种意义减少程序员失误,准确的去重写我们想要重写的方法,因为重写需要保证函数名和参数列表相同,编译器可以尽早帮我们检查出来是否能够对应的上;
- 使用时添加到子类的重写的函数名后即可。