我遇到了调用错误方法的问题。在我的程序中,我有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::getFirstSet
或terminal::getFirstSet
方法?
答案 0 :(得分:3)
您的功能 addFirst 正在按值接收您的对象。这意味着:
每次拨打 addFirst()时,都会从现有的终端或非终端创建并复制新的符号对象。
每当发生所述副本时,生成的对象既不是终端也不是 nonTerminal ,而是它们的基类 - 符号。
要对付它,并避免复制对象,请尝试通过引用传递对象:
bool addFirst (symbol &_s) {
vector<terminal> first = s.getFirstSet();
//....
}