这是我的问题 - 执行此代码后会创建多少个对象?
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辆车,因为每辆车都是车辆。 这是真的吗?
答案 0 :(得分:7)
代码格式错误:vehicle
没有默认构造函数,motorcycle
的唯一构造函数需要其vehicle
基类的默认构造函数。
假设已向vehicle
添加了默认构造函数(并且从:
的构造函数中删除了无关的motorcycle
),我在此处显示的用户代码中计算了16个:
main
的两个论点:argc
和argv
构建Ferrari
:car
,vehicle
,Weight
和HorsePower
以及x
和{ {1}} y
构造函数的参数以及car
构造函数的x
和y
参数。
构建vehicle
:Suzuki
,motorcycle
,vehicle
和Weight
以及HorsePower
和{ {1}} x
构造函数的参数。
我希望我没有错过任何一个。计算在C ++程序中创建的对象的数量是一件很愚蠢的事情:创建了很多很多对象,通常它并不重要。
答案 1 :(得分:2)
只会创建两个实例(对象)。 Ferrari
是单个对象,即使其类(car
)从vehicle
延伸。 Suzuki
也是如此。
答案 2 :(得分:0)
我会选择两个。
由于car
和motorcycle
不能与其基类分开。您将没有4个单独的实例。你也不能独立调用4个析构函数。这种直接推导的低级实现也表示2. Derived类将具有与Base +加上其额外相同的字段。没有car
部分,您无法实例化vehicle
。因此,至少在我看来,你不能把它称为一个单独的对象。
我也认为形式上的问题很模糊。多少个物品是什么意思?我认为应该说明将创建多少个实例。或者有多少种不同的对象类型。
总共会有两个实例。一个是car
,一个是motorcycle
,同时都是vehicle
。
PS。突然出现在我脑海中的另一个交叉检查。致电sizeof(Ferrari)
,motorcycle(Suzuki)
。总结一下。然后添加2x vehicle
并获得它们的大小。 4个实例的总和应该不同,更大。我认为这足以说明,不到“4件物品 - 汽车,摩托车和2辆车”
答案 3 :(得分:0)
答案是'2'。尽管两个对象都继承了基类,但基类被“吸收”到其中。每个对象都有效地充当基类的单个实例,其中“新东西”分层在顶层。
以这种方式思考:想象一下,拿一个高尔夫球,然后用纱线等包裹它,直到它与棒球一样大小/重量/等。它看起来与高尔夫球不同,如果你把它拆开,你就可以在里面进入高尔夫球,但它仍然只是一个物体。实际上,棒球是高尔夫球,有外壳。但总的来说,它仍然是一个单一的对象,即使“高尔夫球”可以单独存在,也可以用其他东西包裹来制作新类型的物体(如保龄球)。