我有以下代码,我正在使用 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
继承时增加?只是为了提供更多背景信息:
我正在使用
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 模拟课程?