派生类插入和提取操作符重载以及从基类到派生类

时间:2017-08-01 09:43:50

标签: c++

  1. 我可以单独定义基类和派生类的流插入和提取运算符吗?
  2. 如果我们从基类派生类,那么如何构建和重载流插入和提取操作符?
  3. 我创建了一个类VehicleTypebikeType,并希望为派生类重载流插入和提取运算符,因为我需要从文件中读取数据,因为当我从带有类变量的文件中读取数据时所以,我会失去更多的时间。我的问题是如何将派生类bikeType转换为vehicleType

    #pragma once
    #ifndef vehicleType_H
    #define vehicleType_H
    #include<string>
    #include"recordType.h"
    using namespace std;
    class vehicleType
    {
      private:
        int ID;
        string name;
        string model;
        double price;
        string color;
        float enginePower;
        int speed;
        recordType r1;
      public:
        friend ostream& operator<<(ostream&, const vehicleType&);
        friend istream& operator>>(istream&, vehicleType&);
        vehicleType();
        vehicleType(int id,string nm, string ml, double pr, string cl, float 
             enP, int spd);
        void setID(int id);
        int getID();
        void  recordVehicle();
        void setName(string);
        string getName();
        void setModel(string);
        string getModel();
        void setPrice(double);
        double getPrice();
        void setColor(string);
        string getColor();
        void setEnginePower(float);
        float getEnginePower();
        void setSpeed(int);
        int getSpeed();
        void print();
     };
      #endif
      #pragma once 
      #ifndef bikeType_H
      #define bikeType_H
      #include"vehicleType.h"
     #include<iostream>
     using namespace std;
     class bikeType :public vehicleType
       {
         private:
           int wheels;
         public:
            bikeType();
            bool  operator<=(int);
            bool operator>(bikeType&);
            bool operator==(int);
            bikeType(int wls, int id, string nm, string ml, double pr, string 
              cl,float enP, int spd);
            void setData(int id, string nm, string ml, double pr, string cl, 
            float enP, int spd);
            void setWheels(int wls);
            int getWheels();
            friend istream& operator>>(istream&, bikeType&);
            friend ostream& operator<<(ostream&, const bikeType&);
            void print();
             };
            #endif
    

    我已经定义了基类和派生类的所有函数,但是只能定义流插入和流提取操作符。

2 个答案:

答案 0 :(得分:0)

  
      
  1. 我可以单独定义基类和派生类的流插入和提取运算符吗?
  2.   

是。正如你所做的那样。

  
      
  1. 如果我们从基类派生类,那么如何构建和重载流插入和提取操作符?
  2.   

如果您想调用基数的提取运算符,可以使用静态强制转换为对base的引用。

答案 1 :(得分:0)

向基类添加虚函数,并在派生类中定义它。

class vehicleType
{
    // ...
    virtual ostream& output(ostream& os) = 0;
};

class bikeType :public vehicleType
{
    // ...
    ostream& output(ostream& os) override
    {
        return os << "I am a bike!";
    }
};

像这样定义输出运算符:

ostream& operator<<(ostream& os, const vehicleType& v)
{
    return v.ouput(os);
}