我正在开发一个包含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}}可以执行。
有人可以解释一下为什么吗?
答案 0 :(得分:2)
A l_dObject = D();
您正在切割对象:这意味着您正在复制对象的A
部分并丢弃D
部分。处理多态对象时,需要使用指针或对基类的引用。例如:
A* l_dObject = new D();
以后不要忘记delete
。
答案 1 :(得分:2)
这就是所谓的切片。
您正在从A
构建D
。 A
可能会提供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