c++ - 如果对象在向量中,如何从子类访问父类中函数的子类版本?
问题描述
所以我有一个 ParentClass 和一个 ChildClass。我有一个矢量对象。我推回了其中的两个项目,一个 ParentClass newparent 对象和一个 ChildClass newchild 对象。我有一个 for-each 循环,我想从这个 for-each 循环中访问父函数的子版本函数,但我不能。请帮忙。
这是代码:
#include <iostream>
#include <vector>
using namespace std;
class ParentClass {
public:
int _a;
ParentClass(int a) {
this->_a = a;
}
void print_a() {
cout << "parent a: " << this->_a << endl;
}
};
class ChildClass: public ParentClass {
public:
ChildClass(int a) : ParentClass(a) {}
void print_a(){
cout << "child a: " << this->_a << endl;
}
};
int main(int argc, char const *argv[]) {
int x = 5, y = 6;
vector<ParentClass> objects;
ParentClass newparent(x); objects.push_back(newparent);
ChildClass newchild(y); objects.push_back(newchild);
for (auto obj : objects){
obj.print_a();
}
return 0;
}
我希望它打印出“child a: 6”,但它会打印出“parent a: 5”和“parent a: 6”
解决方案
如果您有一个ParentCLass
对象向量,它将ParentClass
包含对象。当您添加 时ChildClass
,C++ 将需要应用转换 -push_back
需要ParentCLass const&
. 找到的转换是标准的子到父转换;所以父部分被复制。
这称为“切片”。您可以创建一个std::vector<std::unique_ptr<ParentClass>>
。这不会对对象进行切片,因为向量仅保存(智能)指向对象的指针。
推荐阅读
- vb.net - 如何解决excel ADOB连接中的系统错误&H80040E14 (-2147217900)
- node.js - 节点无法使用 babel 运行
- .htaccess - .htaccess 目录保护在 nginx 中不起作用
- wso2 - 在 WSO2 API Manager 中验证 JSON 架构
- xml - 如何从下面给出的 URN 访问 XSD?
- vue.js - Vue.js:将对象作为道具传递,然后将其属性用作子组件中的属性
- regex - 如何删除特定字符之前的所有字符-记事本++
- c++ - 我可以在一个 UDP 数据包中发送多少数据并且仍然避免碎片?
- python - 当我无权访问绝对路径时,如何使用 python 脚本加载位于不同并行目录中的文本或 csv 文件
- javascript - 如何使用Angular Js检查具有存储在数据库中的现有逗号分隔值的复选框值