【C++】virtual与override
作为一个写c++98写习惯的人,对于c++11开始新引入的一些修饰关键字已经有些模糊,尤其是override已出现,整个人就有点困惑,并且在平日写代码里面还是沿袭了c++98虚函数重载的写法,被同组的小鲜肉鄙视(其实他种种高傲又和自身水平不相称的行为,我是相当鄙视的!),问其原因又未告知。果断看c++11书先了解。
首先看看下面两种写法:
//写法一:
class A {
public:
virtual void A() = 0;
};
class B : public A {
public:
virtual void A() {}
};
//写法二:
class A {
public:
virtual void A() = 0;
};
class B : public A {
public:
void A() override {}
};
本质上上面两种写法并无太大差别,由于A这个类是纯虚类,子类只要存在有函数没有进行重载,编译阶段结汇出现报错,此时override在这里可有可无,区别不大。
但如果是下面两种写法,override就体现了作用
//写法一:
class A {
public:
virtual void A() = 0;
void A(const int a) {}
virtual B() {}
};
class B : public A {
public:
virtual void A() {}
virtual B();
};
//写法二:
class A {
public:
virtual void A() = 0;
void A(const int a) {}
virtual B() {}
};
class B : public A {
public:
void A() override {}
void A(const int a) override {}
void B() override;
};
- 由于带参数的A函数是非虚函数,仅仅可以通过“覆盖”的方式进行,而使用override进行修饰,将会报错属性错误。这样可以用来检查类继承时候,成员函数属性错误的情况
- 由于加了override,在编译阶段,写法二会检查B函数在子类中是否已经被实现,如果没有实现会报错。而对于写法一来说,只有子类的B函数被使用到的时候,才会在链接期进行检查。这样可以提早发现代码漏实现的情况。