将 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);    
};

我想知道:

  1. 创建父对象或基对象 class 时,所有 class 的构造函数 运行 都执行吗?
  2. 基 class 可以访问子 class 的函数或数据吗?
  3. 我不知道在父级 class 中设置平面函数会是什么样子。它会将 Airplane 类型的对象作为参数吗?同样,parent class 中的 addpassenger 函数会将 Passenger 类型的向量作为参数吗?

简而言之

如果 A 继承了 B(或 A 专门化了 B),那么你应该可以说 A 是(某种)B。如有疑问,prefer object composition over inheritance.

更多详情

  1. 成员函数所带的参数,就是你在图中为操作指明的参数。图中没有参数导致代码中没有参数。

  2. 这里的继承是有歧义的。您的图中没有继承。您的代码中有一些,但意义不大:is a passenger really a flight?例如。乘客可以飞行、有机组人员等吗?

    如果继承合适,作为 C++ 中的一般规则:对象的构造函数总是在创建对象时调用。在继承的情况下,将调用 class 层次结构的所有构造函数,从基本构造函数开始,直到最派生的构造函数(规则可能更棘手,例如在多重继承的情况下)。据我所知,在 UML 中,关于构造函数的规则并未完全指定。

  3. 默认情况下,一个 class 只能访问另一个 class 的 public 个成员。如果 class 派生自基础 class(在 UML 中:如果 class 是更一般的 class 的特化),派生的 class 有只能访问 public 和基 class 的受保护成员。尽量避免受保护,因为它是导致严重错误的常见原因。

  4. WHen 在 C++ 中实现 UML class 图时,关于属性和参数的类型有一个棘手的问题,因为 C++ 有一个值语义:如果你传递一个 Airplane 作为参数,原始飞机对象被复制。如果您有 Airplane 属性,则相同。但是,在 UML 中,属性和关联具有引用语义(数据类型除外),这意味着飞机参数仍将引用同一架原始飞机。因此,在您的特定情况下,您可能希望将引用或(智能)指针传递给 Airplane.