dynamic_cast 改变原始对象?

mst*_*rft -3 c++ inheritance casting

为什么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;
}
Run Code Online (Sandbox Code Playgroud)

哪些输出:

call ex2->say(): something else
call ex1->say(): something else
debug: ex1=0xf1e010; ex2=0xf1e010
Run Code Online (Sandbox Code Playgroud)

所以我期望ex2与 不同ex1,因此期望ex2->test = "something else";不会改变ex1。我想这是预期的行为,但为什么呢?(如果它们没有不同,为什么甚至有必要为 的结果分配任何东西dynamic_cast?(可以继续使用ex1?))

任何帮助表示赞赏。

Mik*_*our 5

我想这是预期的行为,但为什么呢?

您正在转换指向不同类型的指针,而不是创建新对象。两者都指向同一个Example对象;一个把它当作MyInterface,另一个当作SubInterface. 因此,通过一个指针修改对象后,对它的更改通过另一个指针可见,因为两者都指向同一个对象。

如果它们没有不同,为什么甚至有必要为 的结果分配任何东西dynamic_cast

它们不一定相同。对于多重继承,不同的基类子对象可能位于完整对象内的不同位置。在这种情况下,向下转换可能必须调整指针值以指向完整的对象。

可以继续使用ex1吗?

不。即使在您的情况下,它确实具有相同的值,但它的类型是错误的。它被声明为指向MyInterface,它没有test成员,所以你不能说ex1->test.