纯虚函数的奇怪行为

时间:2013-07-22 15:59:59

标签: c++ pure-virtual

#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没有。此外,为什么编译器允许在不创建对象的情况下调用非静态函数。

3 个答案:

答案 0 :(得分:5)

bp未指向有效对象,因此您遇到了未定义的行为。在这种情况下,A works but B doesn't是完全有效的未定义行为。请注意,您无法使bp指向B类型的对象,因为它是抽象类型。如果您派生了另一个类并实现了print,那么您可以将bp指向该子对象。

答案 1 :(得分:4)

两者都是未定义的行为,任何事情都可能发生。 bp未初始化,因此调用它或取消引用它是非法的。

答案 2 :(得分:1)

重点:

  1. bp->B::print()可能有效,因为:B::print()明确给出且具有有效指针,并且函数本身不涉及*this指针。它将被翻译为B::print(bp)bp被忽略。

  2. bp->print()可能无效,因为代码会查找对象vptr指向的bp,但不存在。 vptrvtable的位置错误,函数调用将失败。它被翻译成某事。例如:bp->vptr->vtable['print'](bp)' and you can see both vptr and vtable`未定义。