Используйте соответствующие методы полиморфного подкласса - PullRequest
1 голос
/ 12 октября 2011

У меня проблема с вызываемым неправильным методом. В моей программе у меня есть 3 класса: символические, нетерминальные и терминальные. нетерминал и терминал являются подклассами символа.

В моей программе я только создаю терминал или нетерминал. Вот несколько сокращенных версий каждого класса:

#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 метод?

1 Ответ

3 голосов
/ 12 октября 2011

Ваша функция addFirst получает ваш объект по значению . Это означает, что:

  1. Каждый раз, когда вы вызываете addFirst () , создается новый объект символа и копируется из существующего терминала или нетерминала .

  2. Всякий раз, когда происходит упомянутое копирование, результирующий объект не является ни терминал , ни не Терминал , но их базовый класс - символ .

Чтобы противостоять этому и избежать копирования объекта, попробуйте передать ваш объект по ссылке :

bool addFirst (symbol &_s) {
    vector<terminal> first = s.getFirstSet();
    //....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...