我正在使用c++11智能指针重写应用程序。
我有一个基类:
class A {};和一个派生类:
class B : public A {
public:
int b;
};我有另一个类,其中包含一个具有A或B对象的向量:
class C {
public:
vector<shared_ptr<A>> v;
};我可以用A(基类)对象构造C,但是如何用B(派生类)对象填充它?
我试着这样做:
for(int i = 0; i < 10; i++) {
v.push_back(make_shared<B>());
v.back()->b = 1;
}; 编译器返回: error:‘class A’没有名为‘b’的成员
发布于 2013-04-02 19:00:19
但是我如何用B(派生类)对象填充它呢?
您正在用(指向) B对象的指针填充它。但是,指针的静态类型引用基类A,因此您不能直接使用它们来访问派生类的任何成员。
在您的简单示例中,您可以简单地保持指向B的指针并使用它:
std::shared_ptr<B> b = make_shared<B>();
b->b = 1;
v.push_back(b);如果您无法访问原始指针,那么您将需要某种形式的多态性:
static_cast<B*>(v.back().get()) if 您知道所有对象的类型都是虚函数或dynamic_cast (这需要基类包含虚函数才能工作),如果对象可能具有不同的类型,则使用虚函数
发布于 2013-04-02 18:51:54
for(int i = 0; i < 10; i++) {
auto bptr = make_shared<B>();
v.push_back(bptr);
bptr->b = 1;
}; https://stackoverflow.com/questions/15762176
复制相似问题