指向数据成员与非成员的指针的隐式转换

Chr*_*ris 7 c++

我见过的关于成员指针的大多数讨论都集中在成员所属类型允许的转换上.我的问题是关于成员类型的转换.

struct Base{};
struct Derived : public Base{};
struct Foo{ Derived m_Derived; };
Run Code Online (Sandbox Code Playgroud)

鉴于这些声明,以下代码会产生错误(MSVC 2008):

// error C2440: 'initializing' : cannot convert from 'Derived Foo::* ' to 'Base Foo::* '
Base Foo::*p = &Foo::m_Derived;
Run Code Online (Sandbox Code Playgroud)

从Derived*到Base*的转换通常是允许的 - 为什么差异在这里?

Pup*_*ppy 0

有趣的问题。数据指针很少使用,我对规则很不熟悉。

不过,我要赌的是,这是因为多重继承。如果 Base 和 Derived 使用虚拟继承,则编译器无法在编译时知道任何给定 Derived 中 Base 的偏移量,从而使编译时偏移量变得不可能,并且将其合法化为非虚拟继承的工作量太大。遗产。