即使在dynamic_cast失败后,为什么非虚函数调用成功?

时间:2015-11-17 15:41:03

标签: c++ dynamic-cast

以下是代码段

#include <iostream>

using namespace std;

class A
{
public:
    void print() const
    {
        cout << "In A::print()\n";
    }

    virtual void show()
    {
        cout << "In A::show()\n";
    }
};

class B : public A
{
public:
    void print() const
    {
        cout << "In B::print()\n";
    }

    void show()
    {
        cout << "In B::show()\n";
    }
};

int main() {
    A* a = new A;
    a->show();
    a->print();

    B* b = dynamic_cast<B*>(a);
    cout << b << endl;
    b->print();
    b->show();

    return 0;
}

这是我运行时的输出(我使用的是Visual c ++编译器),

In A::show()
In A::print()
00000000
In B::print()

and then program stops working ....

有两个问题,  1.如果B::print()失败,为什么/如何调用函数dynamic_cast成功,因为b的值为0,如输出中所示?

  1. 为什么程序在调用B::show()时停止工作(鉴于此 B::print()之前的电话是否成功排队?

1 个答案:

答案 0 :(得分:1)

毫不奇怪。

  1. b为NULL,因为动态强制转换失败
  2. b-&gt; print()没问题。好吧,this为NULL,但从未在其正文中使用过。
  3. b-&gt; show()失败。尽管它也没有明确地使用this,但它仍然需要一个虚方法表查找来确定正确的子类方法地址。指向虚拟表的指针是B类的(隐藏)字段;如果b为NULL,则程序崩溃。