爲什麼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 2014-12-05 16:21:59
你爲什麼期望它們有所不同?它們是*相同對象*的兩個指針,只是通過*不同的接口*。 – cdhowie 2014-12-05 16:25:02
順便說一下,值得注意的是,即使'ex1'中的原始指針值不等於'ex2'中的原始指針值,它們仍然會指向同一個對象。向下或向上轉換對象指針會導致不同的內存地址,具體取決於編譯器如何爲層次結構中的每個類設置vtables。 (對於多重繼承尤其如此。) – cdhowie 2014-12-05 16:28:50