先复习重写与重载的概念:
重写:接近覆盖,是指派生类覆盖基类的虚函数,而覆盖满足的条件有相同的函数签名和返回类型,也就是说函数名,函数参数以及返回类型相同;
重载:是指在同一个类中有两个或两个以上的函数,函数名相同,而函数签名不同,就是有着不同的形参,比如不同的构造函数;当然普通的函数也可以重载,如函数实现整型和浮点型的相加,函数名相同,而返回值与形参都不同。
int add(int a,int b);
double add(double a,double b);
override说明符与重写有关;
#include<iostream>
using namespace std;
class Base {
public:
virtual void some_func() {}
virtual void foo(int x) {}
virtual void bar() const {}
void baz() {}
};
class Derived : public Base {
public:
virtual void sone_func() {}
virtual void foo(int &x) {}
virtual void bar() {}
virtual void baz() {}
};
int main()
{
Derived D;
return 0;
}
代码的本意是Derived继承Base以及重写Base的虚函数,而在Derived中,四个函数都没触发重写操作;第一个虚函数sone_func的函数名与Base中的some_func的函数名不同,所以不是重写;
第二个Derived虚函数foo(int &x)的形参列表与Base虚函数foo(int x)不同,所以也不是重写;第三个缺少常量属性;而第四个Base的baz()不是虚函数,也不是重写。不过这段代码可以通过编译,但是没有达到想要重写的目的。
override说明符可以告诉编译器,哪些函数需要重写,当编译下面代码时,编译器会报错,方便检查错误。
#include<iostream>
using namespace std;
class Base {
public:
virtual void some_func() {}
virtual void foo(int x) {}
virtual void bar() const {}
void baz() {}
};
class Derived : public Base {
public:
virtual void sone_func() override {}
virtual void foo(int &x) override {}
virtual void bar() override {}
virtual void baz() override {}
};
int main()
{
Derived D;
return 0;
}