简体   繁体   中英

C++11 smart pointers and polymorphism

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

I have a base class:

class A {};

And a derived class:

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

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

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

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

I'm trying this:

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

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

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

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.

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:

  • 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
for(int i = 0; i < 10; i++) {
    auto bptr = make_shared<B>();
    v.push_back(bptr);
    bptr->b = 1;
};  

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM