带继承的C ++动态转换

时间:2016-07-09 07:55:38

标签: c++ inheritance casting dynamic-cast

#include <iostream>

using namespace std;

class A
{
public:
    void foo() { cout << "foo in A" << endl; }
};

class B : public A
{
public:
    void foo() { cout << "foo in B" << endl; }
};


int main() {
    A* a = new B;
    a->foo(); // will print "foo in A" because foo is not virtual
    B* b = new B;
    b->foo(); // will print "foo in B" because static type of b is B

    // the problem
    A* ab;
    ab = dynamic_cast<B*>(new B);
    ab->foo(); // will print "foo in A" !!!!!
}

&#39; dynamic_cast&#39;不改变ab的静态类型?我的意思是,从逻辑上讲,它的接缝相当于B * ab = new B;因为铸造..但它没有。
我以为动态转换会改变对象的静态类型,我错了吗?如果是这样,有什么区别:

A* ab = dynamic_cast<B*>(new B);

A* ab = new B;  

由于

2 个答案:

答案 0 :(得分:1)

你是dynamic_cast到B,但在分配到ab时,你隐含地回到A,所以dynamic_cast再次丢失。

对象ab的实际类型指向仍然是B,但访问对象的指针是A类型,因此选择了A :: foo。如果foo是虚拟的话会有所不同。

答案 1 :(得分:0)

如果从A指针调用foo()函数,将调用A类的foo()。我相信你正在寻找虚拟行为。 如果是这种情况,请将A类的foo()声明为:

virtual void foo() { cout << "foo in A" << endl; }