C++ 两个有趣的问题(静态动态绑定,和类指针指向空的实质)
2017-04-24 15:59
337 查看
在最近几天,讨论C++的基础问题和实质问题的时候,发现了几个根本想不到的问题。特意来分享!
1.关于虚函数有缺省形参时候的表现。
简单介绍下代码。 B 继承 A, 然后 A 和 B 都有一虚函数 Foo(). Foo 有个 int 缺省形参。
因为是虚函数, 所以 A* pA = new B; B* pB = new B; 都动态绑定了B。 然后输出的结果看起来应该是
44. 结果是 24. 很神奇吧。后面查了下。 缺省形参是静态绑定的。 稍微推论下, 虚函数列表中,不存缺省形参。 不信可以试下。
2.如果一个类指针指向空了。这个指针还能调用函数吗?
这个程序, 编译正确, 运行正常, 输出结果为“Hello World”.
理由,虽然 pA 指向了 NULL, 但是pA在调用过程中, 没用this指针调用过任何东西, 直接就是调用cout 函数。 后面有时间可以用汇编看看, 我猜测, 是直接调用call 。
如果有错误 请指出 谢谢
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 。
如果有错误 请指出 谢谢
相关文章推荐
- Java父类引用指向子类对象静态绑定和动态绑定问题
- C++的静态绑定与动态绑定
- 深入理解C++的动态绑定和静态绑定
- [转]C++指针加整数、两个指针相减的问题
- Thinking in C++: 静态指针与指向静态类型的指针
- 有关动态创建释放二维数组,以及指向数组的指针问题集合
- C++中的动态绑定与静态绑定
- 关于C++基类、派生类的引用和指针(动态绑定和静态绑定)
- 深入理解C++的动态绑定和静态绑定--一个牛人写的文章,浅显易懂
- More Effective C++ (静态绑定与动态类型)
- C++关于父类指针指向子类对象的问题
- C++ 静态绑定和动态绑定
- C++指针加整数、两个指针相减的问题
- C++中两个类中互相包含对方对象的指针问题
- 【C++】 动态二维数组 new 指向指针的指针
- 深入理解C++的动态绑定和静态绑定
- 深入理解C++的动态绑定和静态绑定
- C++的动态绑定和静态绑定
- 深入理解C++的动态绑定与静态绑定的应用详解
- 深入理解C++的动态绑定和静态绑定