0

这是我的问题 - 执行此代码后将创建多少个对象?

        class vehicle
        { public:
            int Weight, HorsePower;
            vehicle(int x, int y)
            { Weight = x;
              HorsePower = y;
            }
        };
        class car : public vehicle
        { public:
            car(int x, int y) : vehicle(x, y)
            { }
        };
        class motorcycle : private vehicle
        { public:
            motorcycle(int x, int y): 
            { Weight = x;
              HorsePower = y;
            }
        };

        int _tmain(int argc, _TCHAR* argv[])
        { car Ferrari(4056,540);
          motorcycle Suzuki(429,103);
          return 0;
        }

我和我的朋友争论的是我的观点是 4 个对象——汽车、摩托车和 2 个车辆,因为每个对象都派生出车辆。这是真的?

4

4 回答 4

7

代码格式错误: vehicle没有默认构造函数,唯一的构造函数motorcycle需要其vehicle基类的默认构造函数。

假设添加了一个默认构造函数(并且从 的构造函数中删除vehicle了无关的构造函数),我在此处显示的用户代码中计算了 16 个::motorcycle

  • main: argc和的两个论点argv

  • 八在Ferrari: car, vehicle, Weight, and的构造中HorsePower加上构造函数的 and 参数和构造x函数y的and参数。carxyvehicle

  • 六个在Suzuki: motorcycle, vehicle, Weight,的构造中,HorsePower加上构造函数的xandy参数motorcycle

我希望我没有错过任何一个。计算在 C++ 程序中创建的对象的数量是一件愚蠢的事情:创建了很多很多对象,而且通常这并不重要。

于 2012-09-01T03:15:12.760 回答
2

只会创建两个实例(对象)。Ferrari是单个对象,即使它的类 ( car) 扩展自vehicle. 同样的事情Suzuki

于 2012-09-01T03:10:02.593 回答
0

答案是“2”。尽管两个对象都继承了一个基类,但基类被“吸收”到了其中。每个对象有效地充当基类的单个实例,“新东西”分层在顶部。

这样想:想象一下拿一个高尔夫球,然后用纱线/等包裹它,直到它与棒球的尺寸/重量/等相同。它看起来与高尔夫球不同,如果你把它拆开,你就可以接触到“里面”的高尔夫球,但它仍然是一个单一的物体。实际上,棒球是一个外壳的高尔夫球。但总的来说,它仍然是一个单一的物体,即使“高尔夫球”可以单独存在,也可以用其他东西包裹起来制成新类型的物体(如保龄球)。

于 2012-09-01T08:18:46.527 回答
0

我会选择两个。

因为 a carandmotorcycle不能是与其基类分开的实体。您不会有 4 个单独的实例。您也不能独立调用 4 个析构函数。这种直接派生的低级实现也表示 2。派生类将具有与 Base + 相同的字段以及它的额外字段。你不能实例化car没有它的vehicle一部分。因此,至少在我看来,你不能称它为一个单独的对象。

我也认为这个问题的形式很模糊。多少个对象是什么意思?我认为应该正确说明将创建多少个实例。或者有多少不同的对象类型。

总共会有两个实例。一个是 a car,一个是 amotorcycle并且两者同时存在vehicle

PS。另一个交叉检查突然出现在我的脑海中。打电话sizeof(Ferrari)motorcycle(Suzuki)。总结一下。然后添加 2xvehicle并获得它们的大小。4 个实例的总和应该不同,更大。我认为这足以说明,少于“4 个对象 - 汽车、摩托车和 2 辆车”

于 2012-09-01T03:50:27.107 回答