为什么"设置"/"拆解"在 gtest 中是虚拟的?
Why are `SetUp`/`TearDown` virtual in gtest?
在googletest
入门中,有一个例子,其中SetUp
/TearDown
virtual
。有人可以解释他们为什么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());
}
假设SetUp
和TearDown
在父类中都声明为虚拟,子类中的所有三个声明都是等效的:
virtual void SetUp() {}
void SetUp() {}
void SetUp() override {}
我会坚持使用override
,因为任何拼写错误(如void setUp() override
(都会导致编译错误。
由于override
关键字仅在 C++11 中引入,并且 google 测试框架是在它可用之前创建的,因此我认为override
不会在文档中使用,因为根本没有人费心更新它。
在googletest 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 {}
使成员函数虚拟并受保护意味着在需要时可以覆盖成员(自定义(,但也意味着在基本成员中有一些必需的实现。如果确实选择重写,则应调用基方法。基类 Test 中的 virtual 关键字指示存在多态扩展的范围。
我会覆盖如下(仅当我有其他行为要添加时(:
...
void TearDown() override
{
//Call base TearDown - important
Test::TearDown();
//... My code
}
...
或者(当不需要覆盖时(,可以什么都不做,或者使用...
using testing::TearDown;
。向类用户明确说明拆解是界面的一部分
相关文章:
- 虚拟决赛作为安全
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 如何在C++中获得"静态纯虚拟"功能?
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 大小虚拟继承中的派生类
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- std::is_trivially_copyable_v 关于虚拟功能
- 删除C++继承中虚拟类成员的代码重复
- 子类地址等于虚拟基类地址?
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 用于创建/注册虚拟存储设备的 IOKit 驱动程序
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?