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

C++ C++;:在没有样板代码的情况下调用间接基类构造函数?,c++,inheritance,constructor,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(){}

以下是我的想法:

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的属性,但我想知道是否有正确的方法可以这样做。

解决问题的最简单方法是使构造函数的参数在所有继承层次结构中保持一致。如果默认构造函数可以,那么您应该在所有三个继承级别中都使用它们。如果应该有参数化构造函数,那么它们也应该在所有三个继承级别上。完成此操作后,您将能够构造foo-like的实例

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


我相信没有其他合理的解决方案。

解决问题的最简单方法是使构造函数的参数在所有继承层次结构中保持一致。如果默认构造函数可以,那么您应该在所有三个继承级别中都使用它们。如果应该有参数化构造函数,那么它们也应该在所有三个继承级别上。完成此操作后,您将能够构造foo-like的实例

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


我相信没有其他合理的解决方案。

您的解决方案不适合我。您需要做的是使B构造函数将A需要的参数带入其构造函数中。如果您还希望构造一个默认的构造函数,请创建另一个构造函数。Foo和Bar继承了B的非A,因此它们也不应该调用A的构造函数。

您的解决方案不适合我。您需要做的是使B构造函数将A需要的参数带入其构造函数中。如果您还希望构造一个默认的构造函数,请创建另一个构造函数。Foo和Bar继承了B不是A,所以他们也不应该调用A的构造函数。

我想知道这是否表明了设计问题?如果B1是a的一种,那么它可能需要和a一样多的信息来构建它?@Brian+1:我认为这也一定存在设计问题。我也怀疑这个例子是否恰当。假设如果foo调用A的ctor,那么B的ctor,B的ctor也会再次构造“A”。我认为C++中没有什么比继承更严重的误用了,我不禁认为这是一个误用的例子。不过我们需要更多的上下文信息。我想知道这是否显示了设计问题?如果B1是a的一种,那么它可能需要和a一样多的信息来构建它?@Brian+1:我认为这也一定存在设计问题。我也怀疑这个例子是否恰当。假设如果foo调用A的ctor,那么B的ctor,B的ctor也会再次构造“A”。我认为C++中没有什么比继承更严重的误用了,我不禁认为这是一个误用的例子。不过,我们需要更多的上下文信息。