Syn*_*vil 2 c++ inheritance vector
我知道在C#中有一种方法可以使变量接受值,只要它们共享一个基类,但我很难用C++.我正在尝试做什么?
这就是我的代码:
class BaseClass
{
public:
virtual void Setup() = 0;
virtual void DisplayText() = 0;
};
class A: public BaseClass
{
public:
void Setup();
void DisplayText();
};
class B: public BaseClass
{
public:
void Setup();
void DisplayText();
};
//main.cpp
A a;
B b;
std::vector<BaseClass> vector = std::vector();
void main()
{
vector.push_back(a);
vector.push_back(b);
for_each (vector.begin(), vector.end(), vector.Setup());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我现在拥有的虽然它在我尝试运行时给了我这个错误:
IntelliSense: no instance of overloaded function
"std::vector<_Ty,_Alloc>::push_back [with _Ty=BaseClass,,Alloc=std::allocator<BaseClass>]"
matches the argument list
argument types are: (A*)
object type is: std::vector<BaseClass, std::allocator<BaseClass>>
Run Code Online (Sandbox Code Playgroud)
这里有很多错误.第一:
std::vector<BaseClass> vector = std::vector();
Run Code Online (Sandbox Code Playgroud)
这是无效的语法,vector不是一种类型,因此您不能像在右侧那样创建一个类型.这就足够了:
std::vector<BaseClass> vector;
Run Code Online (Sandbox Code Playgroud)
其次,这不是你打电话的方式for_each:
for_each (vector.begin(), vector.end(), vector.Setup());
Run Code Online (Sandbox Code Playgroud)
没有Setup()功能vector.如果有,那甚至Setup不想你打电话.你想要使用的是std::mem_fun:
for_each (vector.begin(), vector.end(), std::mem_fn(&BaseClass::Setup));
Run Code Online (Sandbox Code Playgroud)
一旦我们到达那里,那么我们就会遇到代码中的主要问题:你正在切割所有对象!好吧,首先,我们试图将抽象类存储在一个vectorby值中,这是不可能的.如果是的话,由于切片问题,它无论如何都不会做你想要的.你需要做的是改变你vector的存储指针BaseClass:
std::vector<BaseClass*> vector;
vector.push_back(&a);
vector.push_back(&b);
Run Code Online (Sandbox Code Playgroud)
然后,只有这样,您的代码才会编译.好吧,假设您在某处提供了虚拟覆盖的定义 - 否则它将不会链接.
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |