首页 > 解决方案 > 在指向各种 Person 实例的 unique_ptrs 向量中访问名为 Truck 的派生类的成员函数的语法是什么?

问题描述

举个具体的例子,假设我被给予

vector<shared_ptr<DClass>> cVector

而DClass(派生自MyClass)有如下接口

class DClass: public MyClass {
  public:
    DClass( string id, string name, int p, int v )
      : MyClass id, name, p ), var1_ ( v ) {}
    int GetDClassVar1() const { return var1_; }
  private:
    int var1_;
};

和 MyClass (其中 DClass 继承自)具有以下接口

class MyClass {
  public:
    MyClass( string id, string name, int p )
      : id_( id ), name_( name ), myclassvar1__( p ) {}
    string GetMyClassID() const { return id_; }
    string GetMyClassName() const { return name_; }
    int GetMyClassVar1() const { return myclassvar1__; }
    virtual int GetDClassVar1() const { return 0; }
  protected:
    string id_;
    string name_;
    int myclassvar1_;
};

假设已填充 cVector,我如何使用 cVector 调用 GetDClassVar1 函数?

***编辑我尝试使用

cVector.at(1).GetDClassVar1.() 

我得到了错误

const value_type’ {aka ‘const class std::shared_ptr<MyClass>’} has no member 
named ‘GetDClassVar1'

标签: c++classvectorshared-ptr

解决方案


假设 cVector 已填充,我如何使用 cVector 调用 GetDClassVar1 函数

for (const auto& d : cVector)
    std::cout << d->GetDClassVar1() << "\n";

请注意,当调用非const-qualified 成员函数时,您需要删除constbefore auto&。对于单个元素:

cVector.front()->getDClassVar1();
cVector.at(42)->getDClassVar1();

这种语法是由于具有转发到底层指针std::shared_ptr的重载成员函数这一事实。operator ->

另请注意,您希望多态基类具有virtual析构函数,请参见此处


推荐阅读