【发布时间】:2011-03-06 18:51:39
【问题描述】:
我的问题不是关于从基类构造函数调用虚成员函数,而是关于虚成员函数的指针在基类构造函数中是否有效。
鉴于以下
class A
{
void (A::*m_pMember)();
public:
A() :
m_pMember(&A::vmember)
{
}
virtual void vmember()
{
printf("In A::vmember()\n");
}
void test()
{
(this->*m_pMember)();
}
};
class B : public A
{
public:
virtual void vmember()
{
printf("In B::vmember()\n");
}
};
int main()
{
B b;
b.test();
return 0;
}
这会为所有兼容的 c++ 编译器生成“In B::vmember()”吗?
【问题讨论】:
-
我猜不会。在 A 的构造函数内部,
*this是 A 类的对象,而 vtable 是 A 的 vtable。此外,如果&A::vmember导致指向B::vmember的指针,我会感到惊讶。但话又说回来,我不是 C++ 大师。 -
@Péter Török:是的,但这就是 vtable 的重点,不是吗。位置保持不变,但子类将其函数指针填充到基类的 vtable 中。因此,函数指针是正确的,但在构造函数中调用它却不是。注意函数指针是在构造函数完成后调用的
-
嗯...可能会。不过,我粗略的理解是,
&A::vmember的结果不是指向 vtable 的指针,而是指向具体成员函数的指针。 -
@Francesco:您可以使用地球上所有可能的编译器进行测试,如果标准中没有明确规定,您仍然无法得出“它有效”的结论。
-
@ereOn:标准中的定义扎实而清晰。
标签: c++ member-function-pointers