作者:A_2na轻奢主义总店访烟 | 来源:互联网 | 2024-11-28 16:17
在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
和两个派生类Derived1
与Derived2
,每个派生类都重写了getType
方法来返回其特定的字符串标识。主函数中,我们创建了一个std::vector
,其中存储了指向基类的智能指针。通过这种方式,我们可以安全地添加各种派生类对象,并且在遍历时能够正确地调用各自版本的getType
方法。