- override关键字作用:
- 如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译。
- 举例子说明
struct Base
{virtual void Turing() = 0;virtual void Dijkstra() = 0;virtual void VNeumann(int g) = 0;virtual void DKnuth() const;void Print();
};
struct DerivedMid: public Base
{// void VNeumann(double g);//接口被隔离了,曾想多一个版本的VNeumann函数
};
struct DerivedTop : public DerivedMid
{void Turing() override;void Dikjstra() override; //无法通过编译,拼写错误,并非重载void VNeumann(double g) override; //无法通过编译,参数不一致,并非重载
void DKnuth() override; //无法通过编译,常量性不一致,并非重载
void Print() override; //无法通过编译,非虚函数重载
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
(之前听过,但是没看过结构体重载 ==)
- 如果没有使用override关键字,上面的写法编译可以通过但是运行的效果与真实意愿(希望重载)不符
- 举例子说明
class testoverride
{
public:testoverride(void);~testoverride(void);virtual void show() const = 0;virtual int infor() = 0;virtual void test() = 0;virtual int spell() = 0;
};class B: public testoverride
{
public:virtual void show(); //1virtual void infor(); //2virtual void vmendd(); //3
virtual void test(int x);//4
virtual void splle(); //5
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
上面的1-5个重载函数编译过程中,除了返回值不同的infor会报错以外,其他函数都不会有问题,但是在类实例化的时候会提示是抽象类,因为他们都没有真正实现重载
class C: public testoverride
{
public:virtual void show() override;virtual void infor() override; virtual void vmendd() override;virtual void test(int x) override;virtual void splle() override;
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
添加了override以后,会在编译器override修饰符则可以保证编译器辅助地做一些检查,上面的情况无法通过编译
- 结论
如果派生类里面是像重载虚函数 就加上关键字override 这样编译器可以辅助检查是不是正确重载,如果没加这个关键字 也没什么严重的error 只是少了编译器检查的安全性