Hemal Shah Ответов: 2

Наследование в параметрах конструктора.


Базовые классы-это A, B, C, а их соответствующие дочерние классы-A1, B1, C1.

-> конструктор класса использует два параметра. (B и C)

Например, A (B *b, C *c).

-> конструктор класса A1 использует два параметра B1 и C1, и я также хочу вызвать конструктор одновременно с передачей аргумента B и C.

Я реализовал его следующим образом : A1 (B *b, C *c, B1 *b1, C1 *c1) : A(b,c).

- но проблема здесь в том, что я должен поддерживать две копии; например, базу b и дочернюю b1. Прежде чем звонить мне нужно подготовить обе Б и В1 по отдельности.
Есть ли лучший способ его реализовать?


Что я уже пробовал:

Пытался :

A (B *b , C *c).

Пытался :
A1 (B *b, C *c, B1 *b1, C1 *c1) : A(b,c).

Kornfeld Eliyahu Peter

Все эти А, В и с сбивают с толку...
Когда вы говорите, что конструктор A имеет два параметра типа B и C, Вы имеете в виду класс B и Класс C, упомянутые только что?
Итак, b и b1-это два разных объекта, один из которых относится к классу типа B, а другой-к классу типа B1?

CPallini

Извините, я вас не понимаю: если вам нужно передать четыре аргумента, то вы должны передать их все: я не вижу кратчайшего пути.

Kornfeld Eliyahu Peter

class B
{
    public:
        B();
};

class B1 : public B
{
    public:
        B1() : B()
        {
            
        };
};

class C
{
    public:
        C();
};

class C1 : public C
{
    public:
        C1() : C()
        {
            
        };
};

class A
{
    public:
        A(B* b, C* c);
};


class A1 : public A
{
    public:
        A1(B* b, C* c, B1* b1, C1* c1) : A(b, c)
        {
            
        };
};

Hemal Shah

Привет Корнфельделияхупете,

Спасибо за ваш ответ.

На самом деле, я реализовал его так же, как и вы реализовали.

Проблема возникает теперь, когда всякий раз, когда я вызываю конструктор A1, в это время мне нужно передать и B, и B1 отдельно.
Перед вызовом конструктора мне нужно установить поля в B и B1 отдельно (или скопировать), а затем я могу их использовать.

Kornfeld Eliyahu Peter

Я не вижу никакого ярлыка для этого - вы разработали установку, где A1 имеет четыре параметра... Вы должны передать четыре параметра...

Hemal Shah

Есть ли какой-либо альтернативный способ, например использовать только B1 и C1 в конструкторе A1 и построить вызов конструктора внутри A1. ?
В таком случае, как пройти B и C ?

Kornfeld Eliyahu Peter

Это возможно, но может быть плохим дизайном (должен ли А1 знать, как создать а?)...

Hemal Shah

Да, A1 знает, что он должен использовать B и C во время вызова конструктора.
Но IDK, как передать B и C внутри A1, так как я только что использовал B1 и C1 в аргументе конструктора A1.

Kornfeld Eliyahu Peter

Ну и что?

class A1 : public A {
  public:
    A1(B1* b1, C1* c1) {
      // create b from b1 and c from c1
      // call base constructor
    }
};

2 Ответов

Рейтинг:
1

Kornfeld Eliyahu Peter

Цитата:
Прежде чем звонить мне нужно подготовить обе Б и В1 по отдельности.
Есть ли лучший способ его реализовать?

Нет.
Как b и b1 есть отдельные объекты, которые вы не можете пройти b к A в любом другом смысле...
(Если b1 был только слепок из b, чем было бы достаточно, чтобы пройти b1)


Рейтинг:
0

Jochen Arndt

Нет необходимости передавать копии. Просто передать указатели на производные классы в конструкторе базового класса A:

class A1 : public A
{
public:
    A1(B1 *b1, C1 *c1) : A(b1, c1) {}
};


Kornfeld Eliyahu Peter

Это верно только в том случае, если b и b1-одно и то же, но это, по-видимому, не так... Или, по крайней мере, не совсем так...

Jochen Arndt

Он требует, чтобы b1 был указателем на класс, производный от B (и аналогичный для c1 / C). Это то, что я прочитал вне вопроса:
"Базовые классы-это A, B, C, а их соответствующие дочерние классы-A1, B1, C1."