好的,所以我整天都被困在这里。我想要做的是有一个函数,它接受某个基类的任何派生,然后将它添加到一个向量。我不能指定所有的衍生物,因为我不认识它们。
我知道这段代码已经过时了,但这对我正在尝试做的事情来说是最简单的,因为我不确定我尝试过的其他任何事情(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 ++。
谢谢你提前:)
答案 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
),而不是对象本身。
答案 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;
}