#include <iostream>
using namespace std;
class B
{
B();
public:
virtual void print()=0;
};
void B::print()
{
cout << "B::print";
}
int main()
{
B *bp;
bp->B::print(); /* Type-A works fine */
bp->print(); /* Type-B segmentation fault */
return 0;
}
在上面的代码中,我试图通过'bp'调用纯虚函数。 现在在main函数中有两种类型的调用(Type-A,Type-B)。我的问题是为什么A有效,但B没有。此外,为什么编译器允许在不创建对象的情况下调用非静态函数。
答案 0 :(得分:5)
bp
未指向有效对象,因此您遇到了未定义的行为。在这种情况下,A works but B doesn't
是完全有效的未定义行为。请注意,您无法使bp
指向B
类型的对象,因为它是抽象类型。如果您派生了另一个类并实现了print
,那么您可以将bp
指向该子对象。
答案 1 :(得分:4)
两者都是未定义的行为,任何事情都可能发生。 bp
未初始化,因此调用它或取消引用它是非法的。
答案 2 :(得分:1)
重点:
bp->B::print()
可能有效,因为:B::print()
明确给出且具有有效指针,并且函数本身不涉及*this
指针。它将被翻译为B::print(bp)
,bp
被忽略。
bp->print()
可能无效,因为代码会查找对象vptr
指向的bp
,但不存在。 vptr
给vtable
的位置错误,函数调用将失败。它被翻译成某事。例如:bp->vptr->vtable['print'](bp)' and you can see both
vptr and
vtable`未定义。