Почему dynamic_cast<new>(old)
изменить old
?dynamic_cast изменяет оригинальный объект?
Пример кода:
#include <iostream>
#include <string>
class MyInterface {
public:
virtual void say() = 0;
virtual ~MyInterface() { }
};
class SubInterface : public MyInterface {
public:
std::string test = "test";
virtual void say() = 0;
virtual ~SubInterface() { }
};
class Example : public SubInterface {
public:
void say() {
std::cout << test << std::endl;
}
};
int main() {
MyInterface* ex1 = new Example();
SubInterface* ex2 = dynamic_cast<SubInterface*>(ex1);
if (ex2 != nullptr) {
std::cout << "call ex2->say(): ";
ex2->test = "something else";
ex2->say();
}
else {
std::cout << "error" << std::endl;
}
std::cout << "call ex1->say(): ";
ex1->say();
std::cerr << "debug: ex1=" << ex1 << "; ex2=" << ex2 << std::endl;
return 0;
}
который выводит:
call ex2->say(): something else
call ex1->say(): something else
debug: ex1=0xf1e010; ex2=0xf1e010
Так я ожидал ex2
будет отличаться от ex1
и, следовательно, ожидается, ex2->test = "something else";
не менять ex1
. Наверное, это предполагаемое поведение, но почему? (Если они не отличаются друг от друга, почему бы даже потребовать присвоить что-либо по результатам dynamic_cast
? (Можно было бы продолжать использовать ex1
?))
Любая помощь приветствуется.
Вы видели http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-const-cast-and-reinterpret-cast-be-used? – matsjoyce
Почему вы ожидаете, что они будут другими? Это два указателя на один и тот же объект *, только через * различные интерфейсы *. – cdhowie
Кстати, стоит заметить, что даже если исходное значение указателя в 'ex1' не было равно, что в' ex2', они все равно указывают на тот же объект. Вниз или вверх-литье указателя объекта может привести к другому адресу памяти, в зависимости от того, как компилятор выводит vtables для каждого класса в иерархии. (Это особенно верно при множественном наследовании.) – cdhowie