2017-08-01 60 views
0
  1. 我可以分別定義基類和派生類的流插入和提取操作符嗎?
  2. 如果我們從基類派生類,那麼我怎樣才能投射和超載流插入和提取操作符?

我創建了一個類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 

我已經定義了基類和派生類的所有函數,但只有流插入和流提取操作符無法定義。

回答

0
  1. 我可以分別定義基類和派生類的流插入和提取操作符嗎?

是的。正如你所做的那樣。

  1. 如果我們從基類派生類,那麼如何投射和重載流插入和提取操作符?

您可以使用靜態澆鑄到基地的參考,如果你想調用基的提取操作。

+0

'的ostream&運算<<(ostream的&OSObject的,常量busType& 總線) { \t OSObject對象<<的static_cast (總線); \t osObject <<「\ t \ t」<< bus.seats <<「\ t \ t」<< bus.wheels << endl; \t return osObject; }'我做了,但編譯器給我錯誤「無效類型 轉換」我不明白這種類型的錯誤。 –

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); 
} 
+0

我已經定義了基類的函數。我想爲派生類定義函數。 –

+0

目前還不清楚你在問什麼。請提供一個最小可驗證的例子。 –

+0

我想告訴你,我們不能把朋友功能變成虛擬功能。 –