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

4

3 回答 3

5

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

于 2013-07-22T16:01:47.360 回答
4

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

于 2013-07-22T16:01:10.790 回答
1

要点:

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

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

于 2013-07-22T16:19:08.703 回答