为什么 `SetUp`/`TearDown` 在 gtest 中是虚拟的?

Why are `SetUp`/`TearDown` virtual in gtest?

googletest Primer中有一个例子,其中SetUp/TearDownvirtual。有人可以解释为什么他们是 virtual 吗?这是引物中逐字逐句的示例:

class QueueTest : public ::testing::Test {
 protected:
  virtual void SetUp() {
    q1_.Enqueue(1);
    q2_.Enqueue(2);
    q2_.Enqueue(3);
  }

  // virtual void TearDown() {}

  Queue<int> q0_;
  Queue<int> q1_;
  Queue<int> q2_;
};

TEST_F(QueueTest, IsEmptyInitially) {
  EXPECT_EQ(0, q0_.size());
}

不知为什么不写成下面这样。行为会改变吗?

class QueueTest : public ::testing::Test {
 protected:
  void SetUp() override {
    q1_.Enqueue(1);
    q2_.Enqueue(2);
    q2_.Enqueue(3);
  }

  // void TearDown() override {}

  Queue<int> q0_;
  Queue<int> q1_;
  Queue<int> q2_;
};

TEST_F(QueueTest, IsEmptyInitially) {
  EXPECT_EQ(0, q0_.size());
}

In the googletest Primer, there is an example, where the SetUp/TearDown are virtual. Can someone explain why they are virtual? Here is an example verbatim from the primer:

class QueueTest : public ::testing::Test {
 protected:
  virtual void SetUp() {
    q1_.Enqueue(1);
    q2_.Enqueue(2);
    q2_.Enqueue(3);
  }

  // virtual void TearDown() {}

  Queue<int> q0_;
  Queue<int> q1_;
  Queue<int> q2_;
};

TEST_F(QueueTest, IsEmptyInitially) {
  EXPECT_EQ(0, q0_.size());
}
I wonder why not writing it as follows. Will the behavior change?

class QueueTest : public ::testing::Test {
 protected:
  void SetUp() override {
    q1_.Enqueue(1);
    q2_.Enqueue(2);
    q2_.Enqueue(3);
  }

  // void TearDown() override {}

使成员函数成为虚拟的和受保护的意味着在需要时可以覆盖成员(自定义),但也意味着在基本成员中有一些必需的实现。如果确实选择重写,则应该调用基本方法。 base class Test 中的 virtual 关键字表明存在多态扩展的范围。

我将重写如下(仅当我要添加其他行为时):

...
void TearDown() override
{
  //Call base TearDown - important
  Test::TearDown();
  //... My code
}
...

或者(当不需要覆盖时),可以什么也不做,或者使用...

using testing::TearDown; 

...向您的 class 用户表明 TearDown 是界面的一部分

鉴于 SetUpTearDown 在父 class 中都被声明为虚拟的,子 class 中的所有三个声明是等价的:

virtual void SetUp() {}
void SetUp() {}
void SetUp() override {}

我会坚持使用 override,因为任何拼写错误(如 void setUp() override)都会导致编译错误。

由于 override 关键字仅在 C++11 中引入,并且 google 测试框架是在它可用之前创建的,我假设 override 未在文档中使用,因为只是没有人费心去更新它。