基类指针的转换构造函数
Conversion constructor from base class pointer
这是一个与家庭作业有关的问题。基本上我必须实现一个科学的计算器。
假设表示文字的简化代码/层次结构:
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;
};
相关文章:
- 构造函数和转换运算符之间的重载解析
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- enable_if转换构造函数(静态强制转换,is_base_of)
- 参数包构造函数在类模板中隐藏用户定义的转换
- c++ 构造函数 将 1 个字符串参数转换为 3 个属性
- 复制构造函数隐式转换问题
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 如果存在从"双精度"到"T"的转换,则禁用构造函数
- C++隐式构造函数转换,后跟类型向上转换
- 此语法中的构造函数转换错误
- C 操作员在具有构造函数转换时过载
- 如何在允许拷贝限制的同时禁用隐式构造函数转换
- 构造函数转换
- 通过构造函数转换容器
- C++ "没有合适的构造函数可以从<默认构造函数>转换为参数化构造函数
- 多个隐式构造函数转换
- (涉及显式)运算符和构造函数转换的优先级
- 构造函数转换如何在C++中工作
- 如何修复GCC编译中的const char *构造函数转换链错误
- 隐式构造函数转换的编译器优化