您当前位置: 首页 » 5 月 2021
按日期归档: 5 月 2021

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

【C++】virtual与override已关闭评论

一些代码优化中的小技巧(表达式优化部分)

奇偶数判断优化

一般情况下判断奇偶数都是用

if (0 == a % 2)

但可以优化为:

if (0 == a & 1)

取偶与取奇

有时候需要对一些数进行取偶,那么代码可以优化为:

取偶:a += a&1
取奇:a += 1-(a&1)

2021-05-13 | | [奇葩类]求上进系列, 数学, 数据结构 & 算法, 编码技巧

一些代码优化中的小技巧(表达式优化部分)已关闭评论