【问题标题】:Two base classes with the same pure virtual function两个具有相同纯虚函数的基类
【发布时间】:2018-02-16 12:55:52
【问题描述】:

我有一个继承自B类的A类。所以A类的接口包含B类的一些纯虚函数和A类的一些函数。现在我需要对A类进行单元测试,所以想要我可以模拟的 A 类的一些接口。 所以现在我想知道给定的代码在 C++14 中是否正确,是否会导致 UB:

class Base1 {
public:
  virtual void func() = 0;
};

class Base2 {
public:
  virtual void func() = 0;
};

class Derived : public Base1, public Base2 {
public:
  void func() override { }
};

int main() {
  Derived d;
  d.func();
  return 0;
}

【问题讨论】:

  • 欢迎您。我们很乐意帮助如果您表明您已尽力而为并陷入困境。那你研究了什么?你试过编译这段代码吗?
  • @FrankS101 几乎在这个问题上是个骗子。该帖子的first answer 肯定也回答了这个问题。
  • 代码在我的机器上编译并运行。这不是未定义的行为。 Arlo Belshee 指出,用于单元测试的模拟是一种代码气味,可以通过消除模拟的需要来帮助改进设计。
  • @Eljay 你能提供 Belshee 的这句话的链接吗?

标签: c++ inheritance virtual-functions


【解决方案1】:

是的,这段代码格式正确,void func() 覆盖了A::func()B::func()。来自 C++14 标准:

[class.virtual]

  1. 如果虚成员函数vfclass Baseclass Derived,直接或间接派生 来自Base,一个同名的成员函数vf, parameter-type-list (8.3.5)、cv-qualification 和 ref-qualifier(或 没有相同的)作为Base::vf 被声明,那么Derived::vf 也是 虚拟(无论是否如此声明)并且它覆盖 Base::vf

【讨论】:

  • @EdvardDavtyan 如果这回答了你的问题,你应该接受它(绿色勾号)
猜你喜欢
  • 2015-12-20
  • 2016-04-19
  • 2013-08-26
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多