仅在知道基类型时添加到Vector的函数

时间:2014-05-22 10:16:48

标签: c++ inheritance

好的,所以我整天都被困在这里。我想要做的是有一个函数,它接受某个基类的任何派生,然后将它添加到一个向量。我不能指定所有的衍生物,因为我不认识它们。

我知道这段代码已经过时了,但这对我正在尝试做的事情来说是最简单的,因为我不确定我尝试过的其他任何事情(auto_ptr,cast,其他)是即使在正确的轨道上。无论如何:

#include <iostream>
#include <vector>

class Base {
public:
    void go() {
        std::cout << "I am the base class" << std::endl;
    }
};

class DerA : public Base {
    void go() {
        std::cout << "I am the first derivative" << std::endl;
    }
};

class DerB : public Base {
    void go() {
        std::cout << "I am the second derivative" << std::endl;
    }
};

class UnrelatedClass {
public:
    std::vector<Base> vec;
    void add_to_vec(Base thing) {
        vec.push_back(thing);
    }
};

int main() {
    Base base;
    DerA dera;
    DerB derb;

    UnrelatedClass uc;
    uc.add_to_vec(base);
    uc.add_to_vec(dera);
    uc.add_to_vec(derb);

    for (auto thing : uc.vec) {
        thing.go();
    }

    return 0;
}

在这个片段中,它们被“切片”(我认为)并且不起作用:

I am the base class
I am the base class
I am the base class

我尝试过使用各种各样的东西,但我真的不确定自己在做什么,也无法让它发挥作用。我最近才开始使用c ++几年后才开始使用c ++。

谢谢你提前:)

2 个答案:

答案 0 :(得分:2)

首先:基类中的函数go应声明为virtual

class Base {
public:
    virtual void go() {
        std::cout << "I am the base class" << std::endl;
    }
};

第二:你应该使用指向基类的指针(可能是智能指针,如std::shared_ptr / std::unique_ptr),而不是对象本身。

example on ideone

答案 1 :(得分:1)

错误是:您正在存储完整的对象而不是指向基类的指针。

如果您打算使用名为&#34; virtual polymorphism&#34;的功能,则需要将衍生对象存储为基类的指针。

此外:您打算采用的每种方法&#34;转发&#34;通过虚拟表到右侧派生类,必须在基类中标记为虚拟

我建议this link作为首次阅读。

这就是你在例子中如何做到的

#include <iostream>
#include <vector>

class Base {
public:
    virtual void go() {
        std::cout << "I am the base class" << std::endl;
    }
};

class DerA : public Base {
    void go() {
        std::cout << "I am the first derivative" << std::endl;
    }
};

class DerB : public Base {
    void go() {
        std::cout << "I am the second derivative" << std::endl;
    }
};

class UnrelatedClass {
public:
    std::vector<Base*> vec;
    void add_to_vec(Base* thing) {
        vec.push_back(thing);
    }
};

int main() {
    Base base;
    DerA dera;
    DerB derb;

    UnrelatedClass uc;
    uc.add_to_vec(&base);
    uc.add_to_vec(&dera);
    uc.add_to_vec(&derb);

    for (auto thing : uc.vec) {
        thing->go();
    }

    return 0;
}

http://ideone.com/LJEz26