派生类虚函数未执行

时间:2013-06-24 18:43:59

标签: c++ c++-cli virtual-functions

我正在开发一个包含C ++项目和C ++ / CLI项目的Visual Solution 我在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();

A的{​​{1}}已执行,但我希望类MyMethod的{​​{1}}可以执行。 有人可以解释一下为什么吗?

2 个答案:

答案 0 :(得分:2)

A l_dObject = D();

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

A* l_dObject = new D();

以后不要忘记delete

答案 1 :(得分:2)

这就是所谓的切片。

您正在从A构建DA可能会提供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