2013-06-24 148 views
0

我正在研究包括C++项目和C++/CLI项目的Visual Solution。
我已经实现的在C++/CLI项目类层次:未执行派生类虚函数

类d => C类=> B类=> A类

=>意味着:从

类衍生A到类D不是ref类。

A包含以下方法:

virtual int MyMethod() const; 

MyMethod也宣布,以D类实现:

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

int MyMethod() const; 

我已经在C++项目写了下面的代码

类别AMyMethod被执行,但我期望类DMyMethod被执行。 有人可以解释我为什么?

回答

2

这就是所谓的切片。

您正在从D构建AA可能提供A的拷贝构造函数,并且不知道D存在。您将D传递给拷贝构造函数(如const A&),构造函数以这种方式从中快速复制。当你们都在这里完成时,你有什么是A。作业后D被杀害。

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

A *l_dObject = new D(); // allocate our D on the heap 
... 
delete l_dObject; // don't forget to delete afterwards 
+0

为了避免这种情况,通常建议禁止使用多态的类的副本。 – Medinoc

2
A l_dObject = D(); 

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

A* l_dObject = new D(); 

请稍后再忘记delete