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

在最近几天,讨论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->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 。

如果有错误 请指出 谢谢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章