【问题标题】:Vector of different objects, objects have non-inherited functions [duplicate]不同对象的向量,对象具有非继承功能[重复]
【发布时间】:2014-03-09 11:53:58
【问题描述】:

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

如何让这成为可能?

下面的代码给出了错误:

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

【问题讨论】:

  • 当对象为BaseObject 类型时,您期望getInt() 返回什么?

标签: c++ object derived-class


【解决方案1】:

您可以使用 dynamic_cast 进行向下转换。如果它不是有效的强制转换,则返回 null。

【讨论】:

  • 正确,但也值得指出的是,如果您的代码看起来像 if(dynamic_cast(ptr)) else if (dynamic_cast(ptr)) 那么普遍接受这表明您的程序存在设计缺陷。
【解决方案2】:

我建议使用多态性。

将 BaseObject 中的 int get() 声明为虚拟:

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->get时,它会调用SubObjA->get()

谷歌多态性。

或者你可以dynamic_cast&lt;SubObjA&gt;,但我认为这不是最好的方法......

【讨论】:

  • 我知道重载 get() 函数是理想的方法,但我故意使用不同名称的函数进行测试。我想创建一个功能差异很大的对象数组,它们每个都有自己的特定[命名]函数。有没有解决方案,还是我必须以不同的方式处理“指针向量”解决方案?
  • 这叫做覆盖
  • 我的错(关于覆盖)。是的,你可以dynamic_cast&lt;SubObjA&gt;(objectVector.front())-&gt;getInt()
  • 但您当然需要事先了解对象派生类。有没有办法创建一个“哑”的指针向量?我希望对象通过基类函数(比如'identify()')来识别自己,此时程序知道哪些函数可用。这些对象将是具有自己特定功能的不同类型的生成器。我只会使用指针来找出它们在内存中的位置,并且向量似乎是订购添加新生成器的过程的方法。
  • Bogdan 发布了一个很好的解决方案,访客模式。
【解决方案3】:

我会使用“访客”模式。它会为您提供与 dynamic_cast 类似的可能性,但是,我发现在许多书籍/文章中强烈建议不要使用“dynamic_cast”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-07
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多