如果我有两个具有相同名称和类型成员的同一层次结构中的类,那么创建指向基类变量的成员指针的“正确”方法是什么。 实施例
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就像我期望的那样。这引出了我的两个问题。
当谈到c ++标准时,以上三种实现都是“安全的”吗?
如果是这样,主流编译器是否与其中任何一个都不兼容?
答案 0 :(得分:2)
我相信这三个都是安全的,虽然我不能引用它们的标准章节和经文。 :)
那就是说,我在旧版Visual Studio中的成员函数指针中遇到了一个非常具体的错误(我不记得哪个,我害怕)。具体来说,我有一个这样的结构:
struct optable_entry {
const char *name;
void (*MyClass::run)();
};
const optable_entry operations[] = {
{ "foo", &MyClass::foo },
/* ... */
};
有了这个,由于某种原因,成员函数值将无法正确初始化。在我的情况下,这是生成的代码,所以用一个庞大的switch语句替换它并不是太麻烦,但是需要注意的是 - 成员函数指针很少用到像这样的奇怪的角落情况可能是潜伏在你的编译器中。