C++ 从另一个子类调用虚函数

C++ 从另一个子类调用虚函数,c++,function,virtual,subclass,abstract,C++,Function,Virtual,Subclass,Abstract,我已经被设置了一个任务来创建一个以中缀符号作为输入的rpn计算器。部分原因是它必须打印出流程的不同阶段。所以首先它应该将一个字符串分离成标记,然后存储在一个向量中。然后它应该将其转换为rpn符号(例如3+4->3 4+),这是我现在卡在上面的部分,也是我现在卡在上面的部分 有人建议我为此使用虚拟抽象函数。首先,我创建了一个带有抽象函数的类。然后我创建一个子类,它将字符串转换为存储在字符串向量中的标记,这部分工作正常。然后我应该创建另一个子类,它将输入字符串转换为rpn表示法,因此我必须在这个子类

我已经被设置了一个任务来创建一个以中缀符号作为输入的rpn计算器。部分原因是它必须打印出流程的不同阶段。所以首先它应该将一个字符串分离成标记,然后存储在一个向量中。然后它应该将其转换为rpn符号(例如3+4->3 4+),这是我现在卡在上面的部分,也是我现在卡在上面的部分

有人建议我为此使用虚拟抽象函数。首先,我创建了一个带有抽象函数的类。然后我创建一个子类,它将字符串转换为存储在字符串向量中的标记,这部分工作正常。然后我应该创建另一个子类,它将输入字符串转换为rpn表示法,因此我必须在这个子类的开头调用函数来转换为令牌,这是我认为出错的地方

我已经得到了一些代码作为模板,到目前为止,它是非常错误的,所以可能有一些错误的语法是错误的

所以我把这个作为我的主要课程

模板
类令牌流{
公众:
虚拟布尔进程(const std::string&input,std::vector&output)=0;
};

然后将其作为第一个子类

 class tokenifier: public tokenstream<std::string> {
public:
    bool process(const std::string& input, std::vector<std::string>& output) {
        //this part works fine, ive tested it. 
};
类令牌生成器:公共令牌流{
公众:
布尔过程(常量std::字符串和输入,std::向量和输出){
//这部分很好,我已经测试过了。
};
然后我必须创建另一个子类,然后在它里面调用上面的函数,这就是它出错的地方

class infix2rpn: public tokenstream<std::string> {
private:
    tokenifier *tokens;
public:
    tokenifier(tokenstream *_tokens): tokens(_tokens) {} //I think this line is the problem
    bool process(const std::string& input, std::vector<std::string>& output) {
        //call the underlying tokenstream object
        std::vector<std::string> infixtokens;
        if(!tokens->process(input, infixtokens))
        {
            return false;
        }
        return shunting_yard(infixtokens, output);
    }
    bool shunting_yard(const std::vector<std::string>& input, std::vector<std::string>& output){
       //i've tested the shunting_yard algorithm and it works fine
    }
};
类infix2rpn:公共令牌流{
私人:
代币制造者*代币;
公众:
tokenizer(tokenstream*\u tokens):tokens(\u tokens){}//我认为这行就是问题所在
布尔过程(常量std::字符串和输入,std::向量和输出){
//调用底层tokenstream对象
std::向量内挤;
如果(!令牌->进程(输入,infixtoken))
{
返回false;
}
回流调车场(内出口、输出);
}
布尔调车场(常数标准:矢量和输入,标准:矢量和输出){
//我已经测试了调车场算法,效果很好
}
};
当我尝试编译它时,我得到了错误:“ISO C++禁止声明‘tokEnter’,没有类型[fpimix]。< /P> 所以我不明白的部分是如何从另一个子类调用其他虚函数

谢谢

这可能意味着是构造函数,但在这种情况下,方法的名称应该是
infix2rpn
,与类名相同。 这个错误意味着,您指定的方法
tokenizer
没有指定返回类型,只有构造函数和析构函数没有返回类型


请注意,
void
也是返回类型的规范,在这种情况下,它意味着不返回任何内容。

您的类被称为
infix2rpn
,因此它的构造函数也应该被命名为
infix2rpn
,而不是
标记器
。这与虚拟函数无关

此外,您的属性应该是
tokenstream*
,而不是
tokenizer*
,因为您无法将在构造函数中获得的
tokenstream*
转换为
tokenizer*

tokenifier(tokenstream *_tokens): tokens(_tokens) {}