将 UML 转换为代码 C++。继承问题。当创建其中任何一个的对象时,所有 类 运行 的构造函数都会被创建吗?
Converting UML to code c++. Problem with inheritence. Do constructors of all classes run when object of any one of them is created?
我有这个 UML 图
广告这是对应的C++代码
//Parent class Flight
class Flight
{
private:
int callNumber;
Airplane plane;
vector<Passenger> passengers;
public:
//Constructor
Flight();
//Functions
int getCallNum();
void setCallNum();
Airplane getPlane();
//What parameters are taken in these functions.
//I know they are of type Airplane and passenger but are they vectors?
void setPlane(Airplane);
void addPassenger(Passenger);
void removePassenger(Passenger);
};
//Airplane class, child of Flight
class Airplane : public Flight
{
private:
int firstClassSeats;
int economySeats;
public:
//Constructor
Airplane();
//Functions;
int getFirstClassSeats();
int getEconomySeats();
void setFirstClassSeats();
void setEconomySeats();
};
//Passenger class, child of FLight
class Passenger : public Flight
{
private:
string name;
int age;
string address;
public:
//Constructor
Passenger();
//Functions
string getName();
int getAge();
string getAddress();
void setName(string);
void setAge(int);
void setAddress(string);
};
我想知道:
- 创建父对象或基对象 class 时,所有 class 的构造函数 运行 都执行吗?
- 基 class 可以访问子 class 的函数或数据吗?
- 我不知道在父级 class 中设置平面函数会是什么样子。它会将 Airplane 类型的对象作为参数吗?同样,parent class 中的 addpassenger 函数会将 Passenger 类型的向量作为参数吗?
简而言之
如果 A 继承了 B(或 A 专门化了 B),那么你应该可以说 A 是(某种)B。如有疑问,prefer object composition over inheritance.
更多详情
成员函数所带的参数,就是你在图中为操作指明的参数。图中没有参数导致代码中没有参数。
这里的继承是有歧义的。您的图中没有继承。您的代码中有一些,但意义不大:is a passenger really a flight?例如。乘客可以飞行、有机组人员等吗?
如果继承合适,作为 C++ 中的一般规则:对象的构造函数总是在创建对象时调用。在继承的情况下,将调用 class 层次结构的所有构造函数,从基本构造函数开始,直到最派生的构造函数(规则可能更棘手,例如在多重继承的情况下)。据我所知,在 UML 中,关于构造函数的规则并未完全指定。
默认情况下,一个 class 只能访问另一个 class 的 public 个成员。如果 class 派生自基础 class(在 UML 中:如果 class 是更一般的 class 的特化),派生的 class 有只能访问 public 和基 class 的受保护成员。尽量避免受保护,因为它是导致严重错误的常见原因。
WHen 在 C++ 中实现 UML class 图时,关于属性和参数的类型有一个棘手的问题,因为 C++ 有一个值语义:如果你传递一个 Airplane
作为参数,原始飞机对象被复制。如果您有 Airplane
属性,则相同。但是,在 UML 中,属性和关联具有引用语义(数据类型除外),这意味着飞机参数仍将引用同一架原始飞机。因此,在您的特定情况下,您可能希望将引用或(智能)指针传递给 Airplane
.
我有这个 UML 图
广告这是对应的C++代码
//Parent class Flight
class Flight
{
private:
int callNumber;
Airplane plane;
vector<Passenger> passengers;
public:
//Constructor
Flight();
//Functions
int getCallNum();
void setCallNum();
Airplane getPlane();
//What parameters are taken in these functions.
//I know they are of type Airplane and passenger but are they vectors?
void setPlane(Airplane);
void addPassenger(Passenger);
void removePassenger(Passenger);
};
//Airplane class, child of Flight
class Airplane : public Flight
{
private:
int firstClassSeats;
int economySeats;
public:
//Constructor
Airplane();
//Functions;
int getFirstClassSeats();
int getEconomySeats();
void setFirstClassSeats();
void setEconomySeats();
};
//Passenger class, child of FLight
class Passenger : public Flight
{
private:
string name;
int age;
string address;
public:
//Constructor
Passenger();
//Functions
string getName();
int getAge();
string getAddress();
void setName(string);
void setAge(int);
void setAddress(string);
};
我想知道:
- 创建父对象或基对象 class 时,所有 class 的构造函数 运行 都执行吗?
- 基 class 可以访问子 class 的函数或数据吗?
- 我不知道在父级 class 中设置平面函数会是什么样子。它会将 Airplane 类型的对象作为参数吗?同样,parent class 中的 addpassenger 函数会将 Passenger 类型的向量作为参数吗?
简而言之
如果 A 继承了 B(或 A 专门化了 B),那么你应该可以说 A 是(某种)B。如有疑问,prefer object composition over inheritance.
更多详情
成员函数所带的参数,就是你在图中为操作指明的参数。图中没有参数导致代码中没有参数。
这里的继承是有歧义的。您的图中没有继承。您的代码中有一些,但意义不大:is a passenger really a flight?例如。乘客可以飞行、有机组人员等吗?
如果继承合适,作为 C++ 中的一般规则:对象的构造函数总是在创建对象时调用。在继承的情况下,将调用 class 层次结构的所有构造函数,从基本构造函数开始,直到最派生的构造函数(规则可能更棘手,例如在多重继承的情况下)。据我所知,在 UML 中,关于构造函数的规则并未完全指定。
默认情况下,一个 class 只能访问另一个 class 的 public 个成员。如果 class 派生自基础 class(在 UML 中:如果 class 是更一般的 class 的特化),派生的 class 有只能访问 public 和基 class 的受保护成员。尽量避免受保护,因为它是导致严重错误的常见原因。
WHen 在 C++ 中实现 UML class 图时,关于属性和参数的类型有一个棘手的问题,因为 C++ 有一个值语义:如果你传递一个
Airplane
作为参数,原始飞机对象被复制。如果您有Airplane
属性,则相同。但是,在 UML 中,属性和关联具有引用语义(数据类型除外),这意味着飞机参数仍将引用同一架原始飞机。因此,在您的特定情况下,您可能希望将引用或(智能)指针传递给Airplane
.