虚拟继承和类函数指针大小

问题描述 投票:0回答:0

我有以下代码,我正在使用 MSVC:

template <typename T>
void CanMock() {
  class SimpleType {};
  static_assert(sizeof(void(SimpleType::*)()) == sizeof(void(T::*)()),
                "Can't mock a type with multiple inheritance or with "
                "non-polymorphic base class");
}

int main() {
  class base {};
  class derived : public base {};
  class derivedVirtual : virtual public base {};
  CanMock<derived>();
  CanMock<derivedVirtual>();
}

static_assert
中的
CanMock
在用
derived
调用时通过但在用
derivedVirtual
调用时失败。

据我所知,断言试图将

SimpleType
的类函数指针的大小与
derivedVirtual
的类函数指针的大小进行比较,

现在我的问题是:

  • 我明白
    derivedVirtual
    的大小应该增加,因为它存储了vtable指针(对吗?),但是为什么
    derivedVirtual
    类函数指针的大小在用
    virtual
    继承时增加?
  • 为什么在 clang 中相同的断言不会失败?

只是为了提供更多背景信息:

我正在使用

FakeIt
进行测试。在某些时候,我想模拟一个特定的类,但由于
static_assert
源代码中的失败
FakeIt
而无法实现。经过一番调查后,我了解到失败是由于我试图模拟的类实际上是从基类继承而来的。所以我带来了上面的代码,从
FakeIt
复制粘贴。

这里是我从那里复制的行。

所以我想到的另一个问题是: 虚拟继承与模拟类的能力之间的关系是什么?

谢谢你的时间。


编辑:

这是当我尝试模拟类时无法编译的 TEST_CASE:

TEST_CASE("Mock") {
    struct base {};
    struct derivedVirtual : virtual public base {
        virtual int A() = 0;
    };
    fakeit::Mock<derivedVirtual> mock; // This triggers the failing static_assert in MSVC but compiles in Clang
}

是否有解决方法允许我使用 FakeIt 模拟课程?

c++ inheritance mocking virtual fakeit
© www.soinside.com 2019 - 2024. All rights reserved.