基类指针的转换构造函数

Conversion constructor from base class pointer

本文关键字:构造函数 转换 指针 基类      更新时间:2023-10-16

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

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

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; }
};

正如您所看到的,存在从不太通用的文字到更通用的文字的转换构造函数,例如Integer到Real。

在某种程度上,我将不得不对类型为Literal *的操作数应用arityn的运算符,并且我需要基于更通用的(ExpressionLiteral > RealLiteral [...] > IntegerLiteral)获得具体文本的向量。

所以我尝试了这样的东西(例如ExpressionLiteral):

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

其中CCD_ 4是CCD_。

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

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

谢谢你的预付款。

您需要一种Literal将自身转换为ExpressionLiteral的方法,其中该转换取决于Literal的运行类型。这就是virtual函数的作用:

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