2015-06-20 2 views
1

в следующем коде, из-за того, что имя() является виртуальным, я ожидаю, что будет вызван метод производной структуры. И наоборот, что выписывается, это «A». Зачем?Static_cast и виртуальные методы в C++

#include <iostream> 
using namespace std; 
struct A { 
    virtual string name() { return "A"; } 
}; 
struct B : A { 
    string name() { return "B"; } 
}; 
int main (int argc, char *argv[]) { 
    B b; 
    cout << static_cast<A>(b).name() << endl; 
    return 0; 
} 
+4

полиморфизм применяется только к методу вызовов с помощью указателей или ссылок. Вы по существу сделали 'A tmp = b; cout << tmp.name() << endl; '. –

ответ

6

static_cast<A>(b) создает временную переменную типа A, построенного из b. Поэтому вызов name() действительно вызывает A::name().

Для наблюдения полиморфного поведения вы можете сделать

static_cast<A&>(b).name() 
0

Как уже упоминалось оливер Чарльзуорт в комментарии, вам необходимо указатель или Refernce объекта, необходимого, чтобы увидеть влияние полиморфизма. Затем система определит динамический тип объекта и вызовет соответствующую функцию. Как вы можете ссылаться на полиморфизм, используя ссылку, объясняется в ответе Антона Савина.

Для ожидаемого результата, если вы хотите использовать указатель, вы должны сделать следующее в основной:

A *a= new B(); 
cout << a->name() << endl; 
+0

Зачем усложнять работу с динамическим распределением? –

1

Что вы испытываете называется нарезка. По существу статический бросок отрежет B часть от объекта, и вы держите просто А.

What is object slicing?