1

如果我有两个在同一层次结构中且具有相同名称和类型的成员的类,那么创建指向基类变量的成员指针的“正确”方法是什么。前任。

class A
{
    int x;
    A():x(1){}
};
class B : public A
{
    int x;
    B():x(2){}
};
int main(int argc, char *argv[]) {
    B classB;
    int B::*ptr = &B::x;
    int B::*ptr1 = &B::A::x;
    int A::*ptr2 = &A::x;
    printf("%d,%d,%d\n", classB.*ptr, classB.*ptr1, classB.*ptr2); 
    return 0;
}

在我的编译器(LLVM GCC)上,这将像我期望的那样打印 2,1,1。这引出了我的两个问题。

  1. 当涉及到 c++ 标准时,上述所有三个实现都是“安全的”吗?

  2. 如果是这样,是否有任何主流编译器与其中任何一个不兼容?

4

1 回答 1

2

相信这三个都是安全的,虽然我不能从他们的标准中引用章节和经文。:)

也就是说,我在旧版本的 Visual Studio 的成员函数指针中遇到了一个非常具体的错误(我不记得是哪个,恐怕)。具体来说,我有一个这样的结构:

struct optable_entry {
    const char *name;
    void (*MyClass::run)();
};

const optable_entry operations[] = {
    { "foo", &MyClass::foo },
    /* ... */
};

这样,由于某种原因,成员函数值将无法正确初始化。在我的例子中,这是生成的代码,所以用大量的 switch 语句替换它并不太麻烦,但需要注意的是——成员函数指针很少被使用,像这样的奇怪的极端情况可能是潜伏在你的编译器中。

于 2011-02-28T03:38:02.740 回答