#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"调用纯虚函数。现在在主函数中有两种类型的调用(A型,B型(。我的问题是为什么A有效,而B不工作。此外,为什么编译器允许在不创建对象的情况下调用非静态函数。
bp
不指向有效对象,因此您遇到未定义的行为。在这种情况下,A works but B doesn't
是完全有效的未定义行为。请注意,您无法bp
指向类型 B
的对象,因为它是抽象类型。如果派生了另一个类并实现了print
则可以bp
指向该子对象。
是未定义的行为,任何事情都可能发生。 bp
未初始化,因此对其调用方法或取消引用它是非法的。
重点:
-
bp->B::print()
可能有效,因为:B::print()
是显式给定的并且具有有效的指针,并且函数本身不涉及*this
指针。它将被翻译成B::print(bp)
,bp
被忽略。 -
bp->print()
可能不起作用,因为代码将查找bp
指向的对象vptr
,该对象不存在。vptr
给vtable
一个错误的位置,函数调用将失败。它被翻译成sth。如:bp->vptr->vtable['print'](bp)' and you can see both
vptrand
vtable' 未定义。