问题
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’
回答1:
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 typeB - 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
回答2:
for(int i = 0; i < 10; i++) {
auto bptr = make_shared<B>();
v.push_back(bptr);
bptr->b = 1;
};
来源:https://stackoverflow.com/questions/15762176/c11-smart-pointers-and-polymorphism