我在查詢之前已經搜索過,但沒有找到任何適用於我的問題的東西。C++ - 在函數中使超類匹配子類參數的指針
我想創建一個指向超類的指針(它總是指一個子類)與一個函數中的子類參數(指針或const引用)匹配。
上下文:在C++中創建一個「高級」計算器。
讓我給你更多的細節類的我這個問題,正在使用:
首先,我們有字面:
class Literal {};
class IntegerLiteral : public Literal {};
class RealLiteral : public Literal {};
class RationalLiteral : public Literal {};
//....
我們必須使用存儲保存文字對象堆棧的不會忽略
// If st is instance of stack then :
st.top(); // returns a Literal*
而且我們有將開拆與堆棧交互操作對象文字*的正確的數字(取決於運營商的元數),在Literal *對象上應用運算符並最終堆棧結果。
class Operator {
int n; // operator arity
public:
virtual void executeOperator(stack *st) = 0; //
};
一個操作員的子類(例如)的:
class PlusOperator : public Operator {
public:
virtual void execute(StackUTComputer *st) override {
Literal* arg1 = st->top();
Literal* arg2 = st->top();
Literal* result = applyOperator(arg1, arg2);
st->pop(); st->pop();
st->push(result);
}
Literal* execute(IntegerLiteral* a, IntegerLiteral* b) {
return new IntegerLiteral(a->getValue() + b->getValue());
}
Literal* execute(IntegerLiteral* a, RealLiteral* b) {
return new RealLiteral(a->getValue() + b->getValue());
}
Literal* execute(IntegerLiteral* a, RationalLiteral* b) {
return new RationalLiteral(
a->getValue() + (a->getValue()*b->getDenominator()),
b->getDenominator()
);
}
// ...
};
我的目的(通過重載函數applyOperator
)是「神奇」讓電腦知道哪些函數調用取決於實際操作符解開的文字類型(類Literal是抽象的:堆棧將始終包含Literal的子類)。
但它不工作,我想要的方式。 我的意思是電話applyOperator(arg1, arg2)
(arg1
和arg2
是Literal *)無效,因爲沒有功能與簽名匹配。我知道我使用C++多態性詮釋了它通常使用的另一種方式(即給出一個超類參數的函數的子類參數)。
我不知道如何扭轉我的架構,以便正確使用多態性,也許有一些語法有用的解決方案,以使我的想法工作。
無論哪種方式,我感謝您的幫助!
拉斐爾。
散文較少,更具體的錯誤消息和[MCVE]將大大有助於改善此問題。 –
在這裏的任何地方都沒有聲明'applyOperator'。 –