UML转C++代码继承相关问题:构造函数、基类访问、成员函数参数疑问
前置设计修正
首先需要纠正现有代码的核心逻辑错误:Airplane(飞机)、Passenger(乘客)和Flight(航班)是组合关系(航班包含1架飞机、包含多名乘客),不是继承关系。你当前写的class Airplane : public Flight、class Passenger : public Flight既不符合业务逻辑,还会导致类循环依赖编译失败,需要先删除这两个类对Flight的继承声明。
问题1:当创建父类或子类的对象时,所有相关类的构造函数都会执行吗?
- 创建子类对象时,会先自动调用父类的无参构造函数(如果子类构造函数的初始化列表没有指定调用父类的其他构造函数),父类构造执行完成后才会执行子类自己的构造函数。
- 创建父类对象时,只会执行父类自己的构造函数,不会触发任何子类的构造函数。
- 补充说明:你的Flight类中包含Airplane类型成员、
vector<Passenger>类型成员,创建Flight对象时,会先调用这些成员变量的构造函数,再执行Flight自身的构造函数。
问题2:基类可以访问子类的函数或数据成员吗?
不可以。基类的作用域中看不到子类新增的成员(成员函数、成员变量),只有子类能访问基类的public和protected权限成员。如果出现需要基类访问子类成员的场景,几乎都说明你的继承设计存在逻辑问题。
问题3:父类中的setPlane函数应该如何实现?它的参数是Airplane类型的对象吗?同理,父类中的addPassenger函数的参数是Passenger类型的vector吗?
删除Airplane、Passenger对Flight的继承之后,函数实现逻辑如下:
setPlane函数:你的Flight类中plane成员是单个Airplane对象,参数传const Airplane&(传引用避免不必要的拷贝开销)即可,实现参考:
void Flight::setPlane(const Airplane& inputPlane) { this->plane = inputPlane; }
addPassenger函数:你的Flight类中passengers是存储多个Passenger的vector,从函数名来看是单次添加单个乘客,所以参数传const Passenger&即可,不需要传vector,实现参考:
void Flight::addPassenger(const Passenger& inputPassenger) { passengers.push_back(inputPassenger); }
如果你需要批量添加多个乘客,可以额外重载一个参数为const vector<Passenger>&的版本,函数名可以改成addPassengers做语义区分。
内容的提问来源于stack exchange,提问作者muhammad muzaib
相关产品推荐
相关产品推荐

