【问题标题】:C++ call a child's method from a vector of parents?C ++从父母的向量中调用孩子的方法?
【发布时间】:2015-09-04 18:05:51
【问题描述】:

假设你有以下类:

class Parent
{
   // methods and members go here
};

然后你根据父级创建一个子级:

class Child : public Parent
{
   public:
      someFunction();
};

现在 Parent 类没有 someFunction() 但 Child 类有。假设您有一个父类的向量,并且您想调用子类的方法,假设向量包含父类和子类的实例,假设它们都是相同的基本类型。

std::vector<Parent> myContainer;
myContainer.push_back(a parent);
myContainer.push_back(a child);

myContainer[1].someFunction();

我怎样才能做到这一点?我基本上是在尝试创建父母的向量,但孩子也进入该向量。我想调用一种儿童专用的方法。这可能吗?

【问题讨论】:

  • 您的向量包含Parent 对象。它对Children一无所知。
  • @Bugster 我会附加您的向量仅包含父对象。:) 它不能容纳子对象。您至少应该定义一个指向多态基类的指针向量。
  • 难道不能创建一个同时容纳两者的容器吗?这不是多态性的好处之一吗?
  • 多态性只适用于指针和引用,所以如果你创建一个指针向量,那么它是可能的。
  • @ivanw 这听起来确实是个好主意,谢谢

标签: c++ class inheritance polymorphism


【解决方案1】:

多态性只适用于指针和引用,所以如果你创建一个指针向量,那么它是可能的。

【讨论】:

  • 这是真正的答案。 多态性不适用于值。
【解决方案2】:
class Parent
{
    virtual void foo(){}    //dummy function to make Parent polymorphic
};
class Child : virtual public Parent
{
public:
    void about()
    {
        cout << "Child" << endl;
    }
};
int main()
{

    vector<Parent*> vec;
    vec.push_back(new Parent());
    vec.push_back(new Child());

    for (int i = 0; i < vec.size(); i++)
    {
        Child *child = dynamic_cast<Child*>(vec.at(i));
        if (child)
            child->about();     
    }

    return 0;
}

【讨论】:

  • 这应该使用unique_ptrshared_ptr 而不是原始指针
  • 同意马特,否则这就是我需要的,谢谢 jafar。
【解决方案3】:

您创建了一个由Parent 对象组成的向量。这里没有多态性。向量包含值。如果你想要一个多态容器,你必须使用别的东西。

就像你做的一样

Parent myObject;

无论你以后对myObject 做什么,它仍然是Parent。即使你这样做myObject = Child()

【讨论】:

  • 我怎样才能做到这一点呢?使用指针向量会起作用吗?
  • @Bugster 是的,但请不要那样做——复制和析构函数的语义都是错误的。如果您使用的是 c++11,则可能是 unique_ptrs 的向量。也许是一个提升ptr_vector
  • 核心问题是 C++ 无法在不知道其完整类型的情况下“克隆”对象。因此,没有简单的方法可以创建具有合理赋值语义的多态容器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 2012-10-17
  • 2015-03-14
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多