纯虚函数的奇怪行为

  • 本文关键字:函数 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"调用纯虚函数。现在在主函数中有两种类型的调用(A型,B型(。我的问题是为什么A有效,而B不工作。此外,为什么编译器允许在不创建对象的情况下调用非静态函数。

bp

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

两者都

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

重点:

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

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

最新更新