用c++编写一个汽车类,派生货车类和客车类,再基于这两个类派生皮卡车类,体现并注释说明虚基类、虚函数和纯虚函数的功能特点
时间: 2024-03-10 12:49:49 浏览: 103
好的,我会尽力回答您的问题。
首先,我们先定义一个基类 Car 类,它包含汽车的基本属性和方法:
```c++
class Car {
public:
Car(int weight, int price);
virtual ~Car();
virtual void run();
virtual void stop();
protected:
int m_weight;
int m_price;
};
```
在 Car 类中,我们定义了汽车的重量和价格,以及 run() 和 stop() 两个虚函数,表示汽车可以行驶和停止。这两个函数是虚函数,因为派生类可能需要重写这两个函数。
接下来,我们派生出货车类 Truck 和客车类 Bus:
```c++
class Truck : virtual public Car {
public:
Truck(int weight, int price, int payload);
virtual ~Truck();
virtual void transport();
protected:
int m_payload;
};
class Bus : virtual public Car {
public:
Bus(int weight, int price, int passenger);
virtual ~Bus();
virtual void pickUp();
protected:
int m_passenger;
};
```
这里使用了虚基类,即 Car 类是虚继承的。这是因为如果不使用虚继承,当我们派生出皮卡车类时,它会同时继承 Truck 和 Bus 类,但是这两个类都继承了 Car 类,这样就会造成 Car 类的成员变量和方法在皮卡车类中出现两次,导致冲突。使用虚继承可以解决这个问题。
在 Truck 类中,我们定义了载重量 payload,并且重写了 transport() 函数,表示货车可以运输货物。
在 Bus 类中,我们定义了乘客数量 passenger,并且重写了 pickUp() 函数,表示客车可以载客。
最后,我们基于 Truck 和 Bus 类派生出皮卡车类 Pickup:
```c++
class Pickup : public Truck, public Bus {
public:
Pickup(int weight, int price, int payload, int passenger);
virtual ~Pickup();
virtual void run();
virtual void stop();
virtual void transport();
virtual void pickUp();
};
```
在 Pickup 类中,我们重写了基类 Car 中的 run() 和 stop() 函数,以及 Truck 类中的 transport() 函数和 Bus 类中的 pickUp() 函数。需要注意的是,我们没有在 Pickup 类中再次定义 m_weight 和 m_price,因为这两个成员变量已经在 Car 类中定义过了,使用虚继承可以避免重复定义。
在上面的代码中,我们定义了虚函数和纯虚函数。虚函数是指在基类中定义一个函数,允许在派生类中重新定义该函数。而纯虚函数是指在基类中定义一个没有函数体的虚函数,它的实现需要在派生类中完成。我们在 Car 类中定义了虚函数 run() 和 stop(),在 Truck 类和 Bus 类中分别重写了这两个函数,而在 Pickup 类中再次重写了这两个函数。同时,在 Car 类中定义了一个纯虚函数,表示这个函数在基类中没有具体的实现,需要在派生类中完成:
```c++
class Car {
public:
// ...
virtual void run() = 0;
// ...
};
```
这个纯虚函数可以用来定义一个接口,表示所有派生类都必须实现这个函数。在 Pickup 类中,我们必须实现这个函数,否则编译器会报错。这样做可以使得代码更加规范、清晰。
阅读全文