2016-07-09 2 views
1
#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" !!!!! 
} 

Не меняет ли «dynamic_cast» статический тип ab? Я имею в виду, что логически это швы эквивалентны B * ab = new B; из-за кастинга. Но это не так.
Я думал, что динамическое изменение изменяет статический тип объекта, я не прав? И если да, то в чем разница между:C++ динамическое литье с наследованием

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

и

A* ab = new B; 

Благодаря

+0

Думай о том, что '' dynamic_cast прикладывается к. Каков тип 'нового B'? – juanchopanza

ответ

1

Вы dynamic_cast ИНГ B, но в момент назначения на аба, вы неявный возвращаясь к A, так что dynamic_cast снова потеряется.

Фактический тип объекта ab указывает на неподвижное значение B, но указатель, к которому обращается объект, имеет тип A, поэтому выбран A :: foo. Было бы иначе, если бы foo был виртуальным.

+0

О! Я пропустил это. Спасибо. – user5618793

0

Если вы вызываете функцию foo() из указателя A, вызывается foo() класса A. Я считаю, что вы ищете виртуальное поведение. Если это так, объявить Foo() класса А, как:

virtual void foo() { cout << "foo in A" << endl; } 
Смежные вопросы