访问抽象类的派生类的抽象类的向量!怎么样?

时间:2015-04-06 08:36:35

标签: c++ inheritance virtual

实际问题:  具有从VAR类继承的抽象类操作,然后所有操作派生类(out,sleep,Add)都从操作类继承。 FSM类也继承自Var,所以我希望在我的程序中有一个VAR类实例。

我正在尝试制作矢量<对< string,int>> var作为FSM类与Operations类及其偏差之间的共享数据。我通过FSM类初始化了main中的var。

每次我们通过Class操作调用VAR中的exists函数时,它返回它不会退出因为它是空的!我怎么能克服这个?

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
class VAR
{
public:vector<pair<string, int>> var;
    VAR()
    {}
 ~VAR(){}
void createVar(string x,int y)
    {}
void setVarValue(string& x, int y)
    {}
int getVarValue(string x){}
 bool exits(string& name)
    {}
class operations : virtual public VAR
{
public:
    operations()
    {}
void virtual excute() = 0;    
};
class Out :public virtual operations
{
};
class Add :public  virtual operations
{
};

class FSM :public virtual VAR, public virtual transition
    {
       void intialize()
        {
            createVar("X", 1);
            createVar("Y", 5);
        }
    };
void main()
{
FSM x;
pair<state, vector<pair<state, int>>> p1;
pair<state, int>p2;
x.intialize();

p2.first.name = "b";
p2.second = 3;
p1.first.name = "a";

p1.second.push_back(p2);
x.trans.push_back(p1);

x.trans[0].first.instructionList.push_back(new Add("X=X+Y"));
x.trans[0].first.instructionList.push_back(new Out("X"));
x.trans[0].first.exec_all();//wrong output cause exist() returns false
}

1 个答案:

答案 0 :(得分:0)

并非所有形状都以长度为特征,因此想要获得所有形状的长度并不合理。例如,一个圆可能有一个半径或一个直径,但是谈论一个圆的长度会让大多数人看起来是空白的。

基类的通常之处在于它提供了与所有形状相关的功能。因此像draw()这样的成员函数可能与所有形状相关(虽然,作为虚函数,每个派生类可以实现如何绘制它的细节),但像setLength()getLength()这样的函数可能不会是

一般来说,当从指针开始到base时,如果需要将其转换为派生类型,那通常被认为是设计损坏的标志(而不仅仅是C ++从业者)。你真正需要做的是计算shape类真正需要提供的功能集,并使它们足够通用,以便它可以处理某些特殊形状需要长度的需要,以及对某些需要其他专业形状没有长度。

很难给出更具体的答案,因为您的需求(以及您的shape类需要提供的功能集)将特定于您的应用程序。

哦:main()在标准C ++中返回int,而不是void。您的编译器可能支持void main(),但不是全部都支持,因此使用它通常被认为是个坏主意。