指向类访问公共成员函数的指针

时间:2013-06-18 10:56:54

标签: c++ class function pointers public

以下程序如何打印“Show Called”?我想它应该是运行时错误,因为obj ptr的值是NULL。

#include<iostream>
using namespace std;

   class ex
    {
        int i;

    public:
        ex(int ii=0):i(ii) {}

        ~ex(){cout<<"dest"<<endl;}

        void show()
        {
            cout<<"Show called";
        }

    };

    int main()
    {
        ex *obj = NULL;
        obj->show();

        return 0;
    }

3 个答案:

答案 0 :(得分:0)

您必须知道如何调用这些方法。

ex::show();
(...)

obj->show();

(通常可能)由您的特定编译器翻译为:

show(ex * this);
(...)

show(obj);

由于你没有在里面使用this,所以没有理由抛出异常......

我强调了您的特定编译器,因为:

  

C ++标准,第8.3.2章,参考文献

     

[注意:特别是,在明确定义的程序中不能存在空引用,因为唯一的方法   创建这样的引用将是绑定到通过空指针间接获得的“对象”,   导致未定义的行为。如9.6中所述,引用不能直接绑定到位字段。    - 后注]

答案 1 :(得分:0)

在您的示例中,该方法是非虚拟的。所以它被实现为普通函数。因为你没有去除this,所以没有问题。如果您的方法是虚拟的,您会调用类似this->__vtable[0](this)的内容,因为您会取消引用0,因此无效。

答案 2 :(得分:0)

由于您没有访问任何公共数据成员,因此不会抛出任何异常。

但如果您尝试通过该对象访问任何公共数据成员,它将抛出异常,因为没有为该对象分配内存。