基类指针

时间:2016-05-05 14:32:12

标签: c++ c++11

这是与家庭作业有关的问题。基本上我必须要实现一个科学计算器。

假设代表文字的简化代码/层次结构:

struct Literal {
    virtual std::string toString() const = 0;
};
struct NumericLiteral : public Literal {};
struct IntegerLiteral : public NumericLiteral {
    int value;
    IntegerLiteral(int value) : value(value) {}
    std::string toString() const override { return std::to_string(value); }
};
struct RationalLiteral : public NumericLiteral {
    int num, den;
    RationalLiteral(int den, int num) : num(num), den(den) {}
    RationalLiteral(IntegerLiteral il) : num(il.value), den(1) {}
    std::string toString() const override { return std::to_string(num) + '/' + std::to_string(den); }
};
struct RealLiteral : public NumericLiteral {
    double value;
    RealLiteral(double value) : value(value) {}
    RealLiteral(IntegerLiteral il) : value(il.value) {}
    RealLiteral(RationalLiteral rl) : value(rl.num / (double)rl.den) {}
    std::string toString() const override { return std::to_string(value); }
};
struct ExpressionLiteral : public Literal {
    std::string expr;
    ExpressionLiteral() {}
    ExpressionLiteral(std::string expr) : expr(expr) {}
    ExpressionLiteral(IntegerLiteral nl) : expr(nl.toString()) {}
    ExpressionLiteral(RationalLiteral rl) : expr(rl.toString()) {}
    ExpressionLiteral(RealLiteral rl) : expr(rl.toString()) {}
    std::string toString() const override { return expr; }
};

正如您所看到的,存在转换构造函数,从较不通用的文字到较一般的文字,例如。整数到实数。

在某些时候,我必须在Literal *类型的操作数上应用arity n 运算符,我需要得到一个具体<的向量/ strong>基于更一般的文字(ExpressionLiteral > RealLiteral [...] > IntegerLiteral)。

所以我试过这样的事情(ExpressionLiteral的例子):

std::vector<ExpressionLiteral> v;
for (auto op : args) v.push_back(ExpressionLiteral(*op));

其中argsstd::vector<Literal*>

这是不成功的,因为ExpressionLiteral没有Literal的转换构造函数。

如何调用与Literal指向的实际类型对应的转换构造函数?

谢谢你提前。

1 个答案:

答案 0 :(得分:1)

您需要一种方法让Literal将自身转换为ExpressionLiteral,其转化取决于Literal的runtype类型。这就是virtual函数的用途:

struct Literal {
    virtual ExpressionLiteral asExpression() const = 0;
};