0

我正在开发一个可视化解决方案,包括一个 C++ 项目和一个 C++/CLI 项目。
我在 C++/CLI 项目中实现了类层次结构:

D 类 => C 类 => B 类 => A 类

=> 表示:源自

A到类D不是参考类。

A包含以下方法:

virtual int MyMethod() const;

MyMethod也在类中声明和实现D

int MyMethod() const;

我在 C++ 项目中编写了以下代码:

A l_dObject = D();
l_dObject.MyMethod();

ClassA被执行,但我MyMethod希望 class被执行。有人可以解释一下为什么吗?DMyMethod

4

2 回答 2

2
A l_dObject = D();

您正在切片对象:这意味着您正在制作对象部分的副本A并丢弃该D部分。处理多态对象时,需要使用指针或对基类的引用。例如:

A* l_dObject = new D();

以后别忘了delete

于 2013-06-24T18:46:12.553 回答
2

这就是所谓的切片。

您正在A从 a构建一个D. A可能从 an 提供了一个复制构造函数,A并且不知道D存在。您将 传递D给复制构造函数(as const A&),构造函数很乐意以这种方式从中复制。当您在这里完成所有操作时,您所拥有的是一个A. D任务完成后被杀死。

这个问题的大多数解决方案都涉及堆上的分配和指针/引用。

A *l_dObject = new D(); // allocate our D on the heap
...
delete l_dObject; // don't forget to delete afterwards
于 2013-06-24T18:49:34.037 回答