您的位置:首页 > 编程语言 > C语言/C++

C++ 两个有趣的问题(静态动态绑定,和类指针指向空的实质)

2017-04-24 15:59 337 查看
在最近几天,讨论C++的基础问题和实质问题的时候,发现了几个根本想不到的问题。特意来分享!

1.关于虚函数有缺省形参时候的表现。

#include<iostream>
using namespace std;
class A
{
public:
virtual void Foo(int i = 2)
{
cout << i;
}
};

class B: public A
{
public:
void Foo(int i = 4)
{
cout << i;
}
};

int main()
{
A* pA = new B;
B* pB = new B;
pA->Foo();
pB->
4000
;Foo();
system("pause");
return 0;
}


简单介绍下代码。 B 继承 A, 然后 A 和 B 都有一虚函数 Foo(). Foo 有个 int 缺省形参。

因为是虚函数, 所以 A* pA = new B; B* pB = new B; 都动态绑定了B。 然后输出的结果看起来应该是

44. 结果是 24. 很神奇吧。后面查了下。 缺省形参是静态绑定的。 稍微推论下, 虚函数列表中,不存缺省形参。 不信可以试下。

2.如果一个类指针指向空了。这个指针还能调用函数吗?

#include<iostream>
using namespace std;
class A
{
public:
void Foo()
{
cout << "Hello World";
}
};
int main()
{
A* pA = NULL;
pA->Foo();
system("pause");
return 0;
}


这个程序, 编译正确, 运行正常, 输出结果为“Hello World”.

理由,虽然 pA 指向了 NULL, 但是pA在调用过程中, 没用this指针调用过任何东西, 直接就是调用cout 函数。 后面有时间可以用汇编看看, 我猜测, 是直接调用call 。

如果有错误 请指出 谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言