您当前位置: 首页 » 编码技巧 » 【C++】virtual与override

【C++】virtual与override

2021-05-17 |

作为一个写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;
};
  1. 由于带参数的A函数是非虚函数,仅仅可以通过“覆盖”的方式进行,而使用override进行修饰,将会报错属性错误。这样可以用来检查类继承时候,成员函数属性错误的情况
  2. 由于加了override,在编译阶段,写法二会检查B函数在子类中是否已经被实现,如果没有实现会报错。而对于写法一来说,只有子类的B函数被使用到的时候,才会在链接期进行检查。这样可以提早发现代码漏实现的情况。
分类:

编码技巧

| 标签: