gpt4 book ai didi

c++ - 使用多态子类各自的方法

转载 作者:行者123 更新时间:2023-11-30 03:05:23 26 4
gpt4 key购买 nike

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

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

#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 方法?

最佳答案

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

  1. 每次您调用 addFirst() 时,都会从现有的terminalnonTerminal 创建并复制一个新的符号对象。 p>

  2. 每当上述复制发生时,生成的对象既不是terminal 也不是nonTerminal,而是它们的基类 - symbol

为了应对它,并避免复制对象,请尝试通过引用传递您的对象:

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

关于c++ - 使用多态子类各自的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7734001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com