C ++:调用没有样板代码的间接基类构造函数?

时间:2010-06-30 11:18:29

标签: c++ inheritance constructor

以下是我的想法:

A - Structure {
 Position
 Name
}

B1 - Vehicle {
 Fuel
}

B2 - Building {
 -nothing-
}

foo - Car
foo2 - Truck
bar - Hospital
bar2 - Market

由于A不是直接基类,所以不可能像下面那样声明构造函数:

foo(x,y,z):A(x,y,z)
bar(a,b,c):A(a,b,c)

所以我尝试这样做:

B1():A(){}
B2():A(){}
...
foo(x,y,z):A(x,y,z),B1()
bar(a,b,c):A(a,b,c),B2()

它有效,但我不确定这是否是正确的方法,因为A构造了两次(或者我认为)。我不想制作相同的构造函数(使用相同的参数),它们将包围A类的构造函数,如:

B1(x,y,z):A(x,y,z){}
...
foo(x,y,z):B1(x,y,z)

编辑:

澄清了一点。

最初,有一个“结构”类,所有的foo和bar都是从这个类中派生出来的,并且一切都很好,但是当我需要向车辆添加燃料时,我不得不区分车辆和建筑物。

完全可以理解车辆和建筑物应该支持相同数量的参数,但我想知道的是,分离构造函数调用是否合法(似乎有效 - 最后的第二个片段 - 似乎是然而,正如我上面所说,我不知道这是否是正确的方法。)

我知道我可以为车辆和建筑物做多次继承,或者简单地使用它的实例作为foo& bar的属性,但我想知道是否有正确的方法这样做。

2 个答案:

答案 0 :(得分:1)

解决问题的最简单方法是使构造函数的参数在所有继承层次结构中保持一致。如果默认构造函数没问题,那么您应该在所有三个继承级别中使用它们。如果应该有参数化构造函数,那么它们也应该处于所有三个级别的继承。在你这样做之后,你将能够构建foo的实例,如

foo(x, y, z): B1(x, y, z);
B1(x, y, z): A(x, y, z);

foo(): B1();
B1(): A();

我认为没有其他合理的解决办法。

答案 1 :(得分:0)

您的解决方案无法为我编译。你需要做的是让B构造函数将A需要的参数带入其构造函数中。如果你还想要一个默认构造的A make另一个B构造函数。 Foo和Bar继承B不是A,所以他们也不应该调用A的构造函数。