我可以将成员数据指针分配给派生类型吗?

pre*_*old 13 c++ member-pointers

这可能最好用示例代码显示.以下无法使用g ++编译:

struct Base {
};

struct Derived : public Base {
};

struct Container {
    Derived data_;
};

int main(void) {
    Base Container::*ptr = &Container::data_;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:invalid conversion from 'Derived Container::*' to Base Container::*'.语言不允许这样做吗?这是编译器错误吗?我使用了错误的语法吗?

请帮忙!

关于为什么我要这样做的一些背景:我有几个我想主要用作派生类型的成员数据,但我希望能够通过一些常用代码填充它们.数据将以任意顺序出现,并有一个字符串标签,我将用它来选择要填充的相应成员数据.我计划创建一个std::map<std::string, Base Container::*>通过公共接口为每个成员分配数据.我想避免使用巨型if else构造来找到正确的成员数据.

APr*_*mer 3

这不是编译器错误,你不能这样做。(但是您可以将 Base::* 分配给 Derived::*)。

我没有看到任何限制的充分理由(除了处理多重继承的情况,这会使成员指针的表示更加复杂)。