首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11智能指针和多态性

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

Stack Overflow用户
提问于 2013-04-02 18:48:38
回答 2查看 18.4K关注 0票数 11

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

我有一个基类:

代码语言:javascript
复制
class A {};

和一个派生类:

代码语言:javascript
复制
class B : public A {
  public:
  int b;
};

我有另一个类,其中包含一个具有A或B对象的向量:

代码语言:javascript
复制
class C {
  public:
  vector<shared_ptr<A>> v;
};

我可以用A(基类)对象构造C,但是如何用B(派生类)对象填充它?

我试着这样做:

代码语言:javascript
复制
for(int i = 0; i < 10; i++) {
    v.push_back(make_shared<B>());
    v.back()->b = 1;
};  

编译器返回: error:‘class A’没有名为‘b’的成员

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-02 19:00:19

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

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

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

代码语言:javascript
复制
std::shared_ptr<B> b = make_shared<B>();
b->b = 1;
v.push_back(b);

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

  • use static_cast<B*>(v.back().get()) if 您知道所有对象的类型都是虚函数或dynamic_cast (这需要基类包含虚函数才能工作),如果对象可能具有不同的类型

,则使用虚函数

票数 17
EN

Stack Overflow用户

发布于 2013-04-02 18:51:54

代码语言:javascript
复制
for(int i = 0; i < 10; i++) {
    auto bptr = make_shared<B>();
    v.push_back(bptr);
    bptr->b = 1;
};  
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15762176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档