【发布时间】:2015-02-03 21:11:17
【问题描述】:
为什么dynamic_cast<new>(old) 会更改old?
示例代码:
#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吗?))
感谢任何帮助。
【问题讨论】:
-
您为什么希望它们有所不同?它们是指向同一个对象的两个指针,只是通过不同的接口。
-
顺便说一句,值得注意的是,即使
ex1中的原始指针值不等于ex2中的值,它们仍然指向同一个对象。向下或向上转换对象指针可能会导致不同的内存地址,具体取决于编译器如何为层次结构中的每个类布置 vtable。 (对于多重继承尤其如此。) -
—1:请检查您的假设在写一个依赖它们是否正确的问题。
标签: c++ inheritance casting