在 C++ 中继承 class 的流
stream with inherited class in C++
我有两个class:
parent class: 车辆
class Vehicle {
private:
string manufacturer;
int cylinder;
Person owner;
public:
Vehicle();
Vehicle(const Vehicle& theObject);
friend istream& operator >>(istream& inStream, Vehicle& object);
friend ostream& operator <<(ostream& outStream, const Vehicle& object);
};
和child class:卡车
我超载了 operator<<
和 operator>>
,这样我就可以在我的 class 卡车上使用 cout
和 cin
。这是我对这两个运算符的定义:
class Truck : public Vehicle {
private:
double loadCapacity;
int towingCapacity;
public:
Truck();
Truck(const Truck& object);
friend istream& operator >>(istream& inStream, Truck& object);
friend ostream& operator <<(ostream& outStream, const Truck& object);
};
istream& operator >>(istream& inStream, Truck& object) {
cout << endl << "Insert truck: "; inStream >> object;
cout << "Insert load capacity: "; inStream >> object.loadCapacity;
cout << "Insert towing capacity: "; inStream >> object.towingCapacity;
return inStream;
}
ostream& operator <<(ostream& outStream, const Truck& object) {
outStream << object;
outStream << endl << "Load capacity: " << object.loadCapacity;
outStream << endl << "Towing capacity: " << object.towingCapacity;
return outStream;
}
当我尝试使用
Truck object;
cin >> object;
cout << object
结果并不像我想的那样。谁能解释为什么?
谢谢
inStream >> object
和outStream << object
都是递归调用,因为object
的静态类型是Truck
,不是Vehicle
。使用 print
和 get
覆盖的虚拟方法 Truck
。在插入器中调用object.print(outStream)
,在提取器中调用object.get(inStream)
,以便通过继承实现多态I/O:
class Vehicle {
private:
string manufacturer;
int cylinder;
Person owner;
public:
Vehicle();
Vehicle(const Vehicle& theObject);
virtual void print(std::ostream& os) const {
os << manufacturer << cylinder << owner;
}
virtual void get(std::istream& is) {
is >> manufacturer >> cylinder >> owner;
}
};
class Truck : public Vehicle {
private:
double loadCapacity;
int towingCapacity;
public:
Truck();
Truck(const Truck& object);
void print(std::ostream& os) const {
Vehicle::print(os);
os << loadCapacity << towingCapacity;
}
void get(std::istream& is) {
Vehicle::get(is);
is >> loadCapacity >> towingCapacity;
}
};
std::istream& operator>>(std::istream& inStream, Vehicle& object) {
object.get(inStream);
return inStream;
}
std::ostream& operator<<(std::ostream& outStream, const Vehicle& object) {
object.print(outStream);
return outStream;
}
我有两个class: parent class: 车辆
class Vehicle {
private:
string manufacturer;
int cylinder;
Person owner;
public:
Vehicle();
Vehicle(const Vehicle& theObject);
friend istream& operator >>(istream& inStream, Vehicle& object);
friend ostream& operator <<(ostream& outStream, const Vehicle& object);
};
和child class:卡车
我超载了 operator<<
和 operator>>
,这样我就可以在我的 class 卡车上使用 cout
和 cin
。这是我对这两个运算符的定义:
class Truck : public Vehicle {
private:
double loadCapacity;
int towingCapacity;
public:
Truck();
Truck(const Truck& object);
friend istream& operator >>(istream& inStream, Truck& object);
friend ostream& operator <<(ostream& outStream, const Truck& object);
};
istream& operator >>(istream& inStream, Truck& object) {
cout << endl << "Insert truck: "; inStream >> object;
cout << "Insert load capacity: "; inStream >> object.loadCapacity;
cout << "Insert towing capacity: "; inStream >> object.towingCapacity;
return inStream;
}
ostream& operator <<(ostream& outStream, const Truck& object) {
outStream << object;
outStream << endl << "Load capacity: " << object.loadCapacity;
outStream << endl << "Towing capacity: " << object.towingCapacity;
return outStream;
}
当我尝试使用
Truck object;
cin >> object;
cout << object
结果并不像我想的那样。谁能解释为什么? 谢谢
inStream >> object
和outStream << object
都是递归调用,因为object
的静态类型是Truck
,不是Vehicle
。使用 print
和 get
覆盖的虚拟方法 Truck
。在插入器中调用object.print(outStream)
,在提取器中调用object.get(inStream)
,以便通过继承实现多态I/O:
class Vehicle {
private:
string manufacturer;
int cylinder;
Person owner;
public:
Vehicle();
Vehicle(const Vehicle& theObject);
virtual void print(std::ostream& os) const {
os << manufacturer << cylinder << owner;
}
virtual void get(std::istream& is) {
is >> manufacturer >> cylinder >> owner;
}
};
class Truck : public Vehicle {
private:
double loadCapacity;
int towingCapacity;
public:
Truck();
Truck(const Truck& object);
void print(std::ostream& os) const {
Vehicle::print(os);
os << loadCapacity << towingCapacity;
}
void get(std::istream& is) {
Vehicle::get(is);
is >> loadCapacity >> towingCapacity;
}
};
std::istream& operator>>(std::istream& inStream, Vehicle& object) {
object.get(inStream);
return inStream;
}
std::ostream& operator<<(std::ostream& outStream, const Vehicle& object) {
object.print(outStream);
return outStream;
}