使用NULL类指针,可以调用类成员函数。这怎么可能?

时间:2014-09-26 12:06:56

标签: c++ inheritance

#include <iostream>
using namespace std;
class A
{
public :
    void show()
    {
        cout << "A "  << endl;
    }

};
class B : public A
{
public :
    void show()
    {
        cout << "B "  << endl;
    }
};
int main()
{
    A *a =NULL;
    a->show(); // Prints 'A'
    B *b =NULL;
    b->show(); // Prints 'B'
}

这是如何打印的,当我们从show继承AB时,如何使用show()类对象调用B?从A继承B时会发生什么?

1 个答案:

答案 0 :(得分:1)

这是未定义的行为,但很多实现都会以您所看到的方式运行。考虑这个电话:

a->show();

编译器可以看到A没有基类,show()不是虚拟的。因此,唯一可以调用的函数是A::show()。好极了,调用它!您需要做的就是(如果您是编译器)将a作为this传递,即隐藏的函数的第一个参数。如果this从未在函数中使用过,那么它很可能正常工作。

即便如此,这也不能保证工作,不可移植,并且是一个坏主意。不要这样做。你的裤子可能会燃烧。