小编fab*_*fab的帖子

MSVC:协变返回类型和虚拟继承

我不确定这是否是 Visual-C++ 编译器中的错误或未定义的行为。

设置

struct DummyBase { virtual ~DummyBase() = default; };
struct DummyDerived : virtual public DummyBase {};
Run Code Online (Sandbox Code Playgroud)

只是一个类和一个使用虚拟继承的派生类

DummyDerived derived;
DummyBase* base = &derived;

std::cout << "Derived : " << &derived << std::endl;
std::cout << "Base    : " << base << std::endl;
Run Code Online (Sandbox Code Playgroud)

当投射DummyDerived*DummyBase*指针时发生偏移。这似乎是由虚拟继承引起的:

Derived : 00000000002CF838
Base    : 00000000002CF840
Run Code Online (Sandbox Code Playgroud)

即使指针值不同,比较也会返回 true:

std::cout << "IsSame  : " << (base == &derived) << std::endl << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出:

IsSame  : 1
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。

问题

问题出现在以下设置中:

 struct IBaseReturner
 { …
Run Code Online (Sandbox Code Playgroud)

c++ virtual-inheritance visual-c++ visual-studio-2013 covariant-return-types

6
推荐指数
1
解决办法
494
查看次数