C++ 如何使操作员过载<&书信电报;对于使用共享基类的派生类?

C++ 如何使操作员过载<&书信电报;对于使用共享基类的派生类?,c++,inheritance,operator-overloading,virtual,subclass,C++,Inheritance,Operator Overloading,Virtual,Subclass,我正在尝试重载操作符 只有virtual函数允许根据对象的动态类型(给定基类的静态类型)进行调度 只有非静态成员函数才能虚拟 运算符您不能覆盖operator@Till它(查看问题中的decl)向我们展示了打印方法和术语的实现:重载意味着拥有两个同时可访问的同名函数,以及基于参数类型的自动编译时选择。重写意味着拥有一组具有相同参数类型的函数,其中一个由“acting”对象的动态类型选择。我有一个经常被过度使用的水晶球,它告诉我,在将派生类型发送到输出迭代器之前,您正在将其对象切片到问题。你能

我正在尝试重载
操作符
  • 只有
    virtual
    函数允许根据对象的动态类型(给定基类的静态类型)进行调度

  • 只有非静态成员函数才能
    虚拟


  • 运算符您不能覆盖
    operator@Till它(查看
    问题
    中的decl)向我们展示了打印方法和术语的实现:重载意味着拥有两个同时可访问的同名函数,以及基于参数类型的自动编译时选择。重写意味着拥有一组具有相同参数类型的函数,其中一个由“acting”对象的动态类型选择。我有一个经常被过度使用的水晶球,它告诉我,在将派生类型发送到输出迭代器之前,您正在将其对象切片到
    问题。你能把插入操作符的代码和你对它的实际用法贴出来吗?“漂亮吗?”波塔托斯沃特:我想你把这个问题弄得比以前更不正确了。您不能覆盖
    
    class Question {
    public:
        enum Type{TEXT, CHOICE, BOOL, SCALE};
        Question():
            type_(), question_() {}
        Question(Type type, std::string question):
            type_(type), question_(question) {}
        friend std::ostream& operator<<(std::ostream& out, const Question& q);
        virtual void print(std::ostream& out) const;
        virtual ~Question();
        private:
        Type type_;
        std::string question_;
    };
    
    class TextQuestion: public Question {
    public:
        TextQuestion():
            Question() {}
        TextQuestion(Type type, std::string question):
            Question(type, question) {}
        void print(std::ostream& out) const;
        virtual ~TextQuestion();
    };
    
    class ChoiceQuestion: public Question {
    public:
        ChoiceQuestion():
            Question(), choices_() {}
        ChoiceQuestion(Type type, std::string question, std::vector<std::string> choices):
            Question(type, question), choices_(choices) {}
        void print(std::ostream& out) const;
        virtual ~ChoiceQuestion();
    private:
        std::vector<std::string> choices_;
    };
    
    class BoolQuestion: public Question {
    public:
        BoolQuestion():
            Question() {}
        BoolQuestion(Type type, std::string question):
            Question(type, question) {}
        void print(std::ostream& out) const;
        virtual ~BoolQuestion();
    };
    
    class ScaleQuestion: public Question {
    public:
        ScaleQuestion():
            Question(), low_(), high_() {}
        ScaleQuestion(Type type, std::string question, int low = 0, int high = 0):
            Question(type, question), low_(low), high_(high) {}
        void print(std::ostream& out) const;
        virtual ~ScaleQuestion();
    private:
        int low_, high_;
    };
    
    std::ostream& operator<<(std::ostream& out, const Question& q) {
    q.print(out);
    return out;
    }
    
    void Question::print(std::ostream& out) const {
        std::string type;
        switch(type_) {
        case Question::TEXT:
            type = "TEXT";
            break;
        case Question::CHOICE:
            type = "CHOICE";
            break;
        case Question::BOOL:
            type = "BOOL";
            break;
        case Question::SCALE:
            type = "SCALE";
            break;
        }
        out << type << " " << question_;
    }
    
    void TextQuestion::print(std::ostream& out) const {
        Question::print(out);
    }
    
    void ChoiceQuestion::print(std::ostream& out) const {
        Question::print(out);
        out << std::endl;
        int size(get_choices_size());
        for (int i = 0; i < size; ++i) {
            out << choices_[i] << std::endl;
        }
    }
    
    void BoolQuestion::print(std::ostream& out) const {
        Question::print(out);
       }
    
    void ScaleQuestion::print(std::ostream& out) const {
        Question::print(out);
            out << " " << low_ << " " << high_;
    }  
    
    TextQuestion q( "What is hello, world?" ); // Original object
    Question & qr( q ); // Reference, not another object
    Question q2( q ); // Base class object with copied subset (slice) of data.
    
    std::cout << q << '\n'; // Observe subclass behavior.
    std::cout << qr << '\n'; // Observe subclass behavior due to dynamic typing.
    std::cout << q2 << '\n'; // Observe superclass behavior due to slicing.