我想创建一个对象向量,很可能是从一个基类派生出来的,它可能有也可能没有自己的个人非派生函数。到目前为止,我无法调用这些函数,因为它们不是向量声明中使用的类的一部分。
如何才能实现这一目标?
下面的代码给出错误:
../ src / ObjectVectors.cpp:22:33:错误:'BaseObject'中没有名为'getInt'的成员
//============================================================================
// Name : ObjectVectors.cpp
// Author : Edwin Rietmeijer
// Version :
// Copyright : This code is owned by Edwin Rietmeijer as of 2014
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <vector>
#include "BaseObject.h"
#include "SubObjA.h"
using namespace std;
int main() {
vector<BaseObject *> objectVector;
objectVector.push_back( new SubObjA );
cout << objectVector.front() -> getInt() << endl;
// for ( pos = objectVector.begin(); pos != objectVector.end(); ++pos )
// cout << pos -> get() << endl;
}
/*
* BaseObject.h
*
* Created on: Feb 11, 2014
* Author: edwinrietmeijer
*/
#ifndef BASEOBJECT_H_
#define BASEOBJECT_H_
class BaseObject {
public:
BaseObject();
int get();
virtual ~BaseObject();
};
#endif /* BASEOBJECT_H_ */
/*
* BaseObject.cpp
*
* Created on: Feb 11, 2014
* Author: edwinrietmeijer
*/
#include "BaseObject.h"
BaseObject::BaseObject() {
// TODO Auto-generated constructor stub
}
int BaseObject::get(){
return 0;
}
BaseObject::~BaseObject() {
// TODO Auto-generated destructor stub
}
/*
* SubObjA.h
*
* Created on: Feb 11, 2014
* Author: edwinrietmeijer
*/
#ifndef SUBOBJA_H_
#define SUBOBJA_H_
#include "BaseObject.h"
class SubObjA : public BaseObject {
int data = 88;
public:
SubObjA();
int getInt();
virtual ~SubObjA();
};
/*
* SubObjA.cpp
*
* Created on: Feb 11, 2014
* Author: edwinrietmeijer
*/
#include "SubObjA.h"
SubObjA::SubObjA() {
// TODO Auto-generated constructor stub
}
int SubObjA::getInt() {
return data;
}
SubObjA::~SubObjA() {
// TODO Auto-generated destructor stub
}
答案 0 :(得分:2)
您可以使用dynamic_cast向下转发。如果它不是有效的强制转换,则返回null。
答案 1 :(得分:2)
我会使用'访客'模式。它会给你类似dynamic_cast的可能性,但是,我发现很多书/文章都强烈反对“dynamic_cast”。
答案 2 :(得分:1)
我建议使用多态。
将BaseObject中的int get()声明为virtual:
virtual int get() { return 0, }
在subObjA中重载:
virtual int get() { return data; } // the virtual isn't mandatory here, just easier to read
int get() override { return data; } // c++11 version
这样,当你调用BaseObject-&gt; get时,它会调用SubObjA-&gt; get()
谷歌多态性。或者你可以dynamic_cast<SubObjA>
,但我不认为这是最好的方法......