C++ 使用空类指针,可以调用类成员函数。这怎么可能? #包括 使用名称空间std; 甲级 { 公众: 无效显示() { CUT< P>这是未定义的行为,但是很多实现会按照你所看到的方式来执行。考虑这个调用: #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' }

C++ 使用空类指针,可以调用类成员函数。这怎么可能? #包括 使用名称空间std; 甲级 { 公众: 无效显示() { CUT< P>这是未定义的行为,但是很多实现会按照你所看到的方式来执行。考虑这个调用: #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' },c++,inheritance,C++,Inheritance,编译器可以看到A没有基类,并且show()不是虚拟的。因此,唯一可以调用的函数是A::show()。太好了,调用它吧!您所需要做的一切(如果您是编译器的话)将a作为this传递,即函数的隐藏第一个参数。如果函数中从未使用过this,则它可能工作正常 即便如此,这也不能保证有效,不可移植,而且是个坏主意。不要这样做。你的裤子可能会烧坏。取消引用空指针是未定义的行为。你使用什么编译器允许这种行为?我刚刚用g++4.8.1试过他的代码,它也打印a和B。好吧,它仍然是UB。编译器等可以做什么只要他们愿意

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


即便如此,这也不能保证有效,不可移植,而且是个坏主意。不要这样做。你的裤子可能会烧坏。

取消引用空指针是未定义的行为。你使用什么编译器允许这种行为?我刚刚用g++4.8.1试过他的代码,它也打印a和B。好吧,它仍然是UB。编译器等可以做什么只要他们愿意。一旦有虚拟的东西,它肯定会崩溃。这是未定义的行为。但要猜一下为什么会发生这种情况;
this
传递给成员函数的“不可见”参数为空,但它本身从未被引用,所以代码“看起来”工作,但这确实是未定义的行为。任何情况都可能发生。这确实是未定义的行为,但通常的做法是在访问数据成员之前不在非虚拟方法调用中检查“This”参数。例如,在Microsoft标准库中,有一个方法显式:返回m_hWnd,如果此指针为NULL,则返回NULL
a->show();