C++11 智能指针和多态性

C++11 smart pointers and polymorphism(C++11 智能指针和多态性)
本文介绍了C++11 智能指针和多态性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 c++11 智能指针重写应用程序.

I'm rewriting an application using c++11 smart pointers.

我有一个基类:

class A {};

还有一个派生类:

class B : public A {
  public:
  int b;
};

我有另一个类包含带有 A 或 B 对象的向量:

I have another class containing a vector with either A or B objects:

class C {
  public:
  vector<shared_ptr<A>> v;
};

用 A(基类)对象构造 C 没有问题,但是如何用 B(派生类)对象填充它?

I have no problem constructing C with A (base class) objects but how can I fill it with B (derived class) objects?

我正在尝试这个:

for(int i = 0; i < 10; i++) {
    v.push_back(make_shared<B>());
    v.back()->b = 1;
};  

编译器返回:错误:A 类"没有名为b"的成员

And the compiler returns: error: ‘class A’ has no member named ‘b’

推荐答案

但是如何用 B(派生类)对象填充它?

But how can I fill it with B (derived class) objects?

您正在用(指向)B 对象的(指针)填充它.但是,指针的静态类型是指基类 A,因此您不能直接使用它们来访问派生类的任何成员.

You are filling it with (pointers to) B objects. However, the pointers' static type refers to the base class A, so you cannot directly use these to access any members of the derived class.

在您的简单示例中,您可以简单地保持指向 B 的指针并使用它:

In your simple example, you could simply keep hold of a pointer to B and use that:

std::shared_ptr<B> b = make_shared<B>();
b->b = 1;
v.push_back(b);

如果您无法访问原始指针,那么您将需要某种多态性:

If you don't have access to the original pointer, then you will need some kind of polymorphism:

  • 使用 static_cast<B*>(v.back().get()) 如果你知道所有对象都有类型 B
  • 如果对象可能有不同的类型,请使用虚函数或 dynamic_cast(需要基类包含虚函数才能工作)
  • use static_cast<B*>(v.back().get()) if you know that all objects have type B
  • use a virtual function or dynamic_cast (which requires the base class to contain a virtual function to work) if the objects might have different types

这篇关于C++11 智能指针和多态性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Polymorphic copy-constructor with type conversion(具有类型转换的多态复制构造函数)
Cast to a Child(铸造给孩子)
How to use virtual functions to achieve a polymorphic behavior in C++?(如何使用虚函数在 C++ 中实现多态行为?)
Polymorphism is not working with function return values of same data type (Base and Inherited class)(多态性不适用于相同数据类型(基类和继承类)的函数返回值)
Size of class with virtual function adds extra 4 bytes(具有虚函数的类的大小增加了额外的 4 个字节)
Right design pattern to deal with polymorphic collections of objects(正确的设计模式来处理对象的多态集合)