矢量的不同对象,对象具有非继承功能

时间:2014-02-11 15:36:34

标签: c++ object derived-class

我想创建一个对象向量,很可能是从一个基类派生出来的,它可能有也可能没有自己的个人非派生函数。到目前为止,我无法调用这些函数,因为它们不是向量声明中使用的类的一部分。

如何才能实现这一目标?

下面的代码给出错误:

../ 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();
};

#endif / * SUBOBJA_H_ * /

/*
 * 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
}

3 个答案:

答案 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>,但我不认为这是最好的方法......