使用多态子类的相应方法

时间:2011-10-12 00:20:33

标签: c++ polymorphism

我遇到了调用错误方法的问题。在我的程序中,我有3个类:symbol,nonTerminal和terminal。 nonTerminal和terminal都是符号的子类。

在我的程序中,我只创建一个终端或非终端。以下是每个类的一些精简版本:

#ifndef SYMBOL_H
#define SYMBOL_H

#include <vector>

class terminal;

using namespace std;

class symbol {
   public:
        virtual vector<terminal> getFirstSet();
};

#endif

_

#ifndef NONTERMINAL_H
#define NONTERMINAL_H

#include "symbol.h"
#include "terminal.h"
#include <vector>

using namespace std;

class terminal;

class nonTerminal: public symbol {
    public:
        vector<terminal> getFirstSet();
};

#endif

_

#ifndef TERMINAL_H
#define TERMINAL_H

#include "symbol.h"
#include <vector>

using namespace std;

class terminal: public symbol {
    public:
        vector<terminal> getFirstSet();
};

#endif

我有这个功能:

bool addFirst(symbol s) {
    vector<terminal> first = s.getFirstSet();
    //....
}

但是,无论何时我使用终端或非终端调用它,它总是使用symbol::getFirstSet方法。如何让它调用正确的nonTerminal::getFirstSetterminal::getFirstSet方法?

1 个答案:

答案 0 :(得分:3)

您的功能 addFirst 正在按值接收您的对象。这意味着:

  1. 每次拨打 addFirst()时,都会从现有的终端非终端创建并复制新的符号对象。

  2. 每当发生所述副本时,生成的对象既不是终端也不是 nonTerminal ,而是它们的基类 - 符号

  3. 要对付它,并避免复制对象,请尝试通过引用传递对象

    bool addFirst (symbol &_s) {
        vector<terminal> first = s.getFirstSet();
        //....
    }