C ++: вызов косвенного конструктора базового класса без шаблонного кода? - PullRequest
1 голос
/ 30 июня 2010

Вот что я подумал сделать:

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, но мне интересно, есть ли правильный способ сделать это таким образом.

Ответы [ 2 ]

1 голос
/ 30 июня 2010

Самый простой способ решить вашу проблему - сделать параметры конструкторов согласованными по всей иерархии наследования.Если конструкторы по умолчанию в порядке, вы должны их использовать и использовать на всех трех уровнях наследования.Если должны быть параметризованные конструкторы, они также должны быть на всех трех уровнях наследования.После того, как вы это сделаете, вы сможете создавать экземпляры foo, такие как

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

или

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

Я считаю, что другого разумного решения для этого нет.*

0 голосов
/ 30 июня 2010

Ваше решение не компилируется для меня.То, что вам нужно сделать, это заставить конструкторы B принимать аргументы, которые нужны A, в его конструктор.Если вы также хотите построить A по умолчанию, создайте еще один конструктор B.Foo и Bar наследуют B не A, поэтому им никогда не следует вызывать конструктор A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...