热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解决在父类向量中访问子类特有属性的问题

探讨如何在C++中,当子类实例存储在父类类型的向量中时,正确访问子类特有的成员变量或方法。

在C++编程中,有时会遇到将不同子类的对象存储到一个父类类型的向量中的情况。这种做法虽然能够利用多态性,但在实际操作中可能会遇到一个问题:当你尝试访问向量中某个特定子类的独有属性或方法时,发现只能访问到父类的属性或方法,这是因为向量中存储的是父类对象的副本,导致了所谓的'切片问题'。

为了解决这个问题,可以采用指针或智能指针(如std::unique_ptr)来替代直接存储对象的方式。这种方式下,向量中存储的是指向基类的指针,而这些指针实际上指向的是不同的子类对象,从而能够在运行时根据实际对象的类型调用相应的方法,实现真正的多态行为。

下面是一个具体的代码示例,展示了如何通过使用std::unique_ptr来避免切片问题,并正确地访问子类的特有属性:

#include 
#include
#include
#include
class Base {
public:
virtual ~Base() = default; // 确保正确的析构
virtual const std::string& getType() cOnst= 0;
};
class Derived1 : public Base {
public:
const std::string& getType() const override {
return type;
}
private:
const std::string type = "Derived1";
};
class Derived2 : public Base {
public:
const std::string& getType() const override {
return type;
}
private:
const std::string type = "Derived2";
};
int main() {
std::vector> objects;
objects.push_back(std::make_unique());
objects.push_back(std::make_unique());
for (const auto& obj : objects) {
std::cout <getType() < }
return 0;
}

在这个例子中,我们定义了一个基类Base和两个派生类Derived1Derived2,每个派生类都重写了getType方法来返回其特定的字符串标识。主函数中,我们创建了一个std::vector,其中存储了指向基类的智能指针。通过这种方式,我们可以安全地添加各种派生类对象,并且在遍历时能够正确地调用各自版本的getType方法。


推荐阅读
author-avatar
A_2na轻奢主义总店访烟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有