将创建多少个对象?

时间:2012-09-01 03:06:19

标签: c++ oop

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

        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 个答案:

答案 0 :(得分:7)

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

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

  • main的两个论点:argcargv

  • 构建FerraricarvehicleWeightHorsePower以及x和{ {1}} y构造函数的参数以及car构造函数的xy参数。

  • 构建vehicleSuzukimotorcyclevehicleWeight以及HorsePower和{ {1}} x构造函数的参数。

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

答案 1 :(得分:2)

只会创建两个实例(对象)。 Ferrari是单个对象,即使其类(car)从vehicle延伸。 Suzuki也是如此。

答案 2 :(得分:0)

我会选择两个。

由于carmotorcycle不能与其基类分开。您将没有4个单独的实例。你也不能独立调用4个析构函数。这种直接推导的低级实现也表示2. Derived类将具有与Base +加上其额外相同的字段。没有car部分,您无法实例化vehicle。因此,至少在我看来,你不能把它称为一个单独的对象。

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

总共会有两个实例。一个是car,一个是motorcycle,同时都是vehicle

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

答案 3 :(得分:0)

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

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