Как избежать явного конструирования всего, что унаследовано в списке инициализаторов в C ++? - PullRequest
0 голосов
/ 19 февраля 2019

Когда я создаю объект DI, мне нужно включить конструкторы для A, B и C в список инициализатора.Есть ли способ сделать так, чтобы мне не нужны все три в списке инициализатора или нет?

Если я пытаюсь инициализировать D, используя только конструктор для BI, получаю ошибку, потому что у меня нетконструктор по умолчанию для A или C. Если я добавлю конструктор по умолчанию для A и CI, возникнут проблемы с повторной инициализацией i без значения.

#include <iostream>
using namespace std;

class A 
{
    int i;
public:
    A(int ii) :
        i(ii)
    {}

    ~A() { }

    int getI() { return i; }
};

class B : public virtual A
{
public:
    B(int ii) :
        A(ii)
    { }

    ~B() { }
};

class C : public virtual A 
{
public:
    C(int ii) :
        A(ii)
    { }

    ~C() { }
};

class D : public B, public C 
{
public:
    D(int ii) :
        A(ii), B(ii), C(ii)
    { }
    ~D() { }

 };

int main() 
{
    D d(45);
    cout << d.getI() << endl;
}

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Если вы добавите конструкторы по умолчанию к A, B и C, реализация D станет немного проще.

#include <iostream>
using namespace std;

class A 
{
   int i;
   public:
   A() : i(0) {}
   A(int ii) : i(ii) {}

   ~A() { }

   int getI() { return i; }
};

class B : public virtual A
{
   public:
      B() { }
      B(int ii) : A(ii) { }

      ~B() { }
};

class C : public virtual A 
{
   public:
      C() { }
      C(int ii) : A(ii) { }

      ~C() { }
};

class D : public B, public C 
{
   public:

      // Relies on default constructors of the other classes.
      D() { }

      // Relies on the default constructors of B and C.
      D(int ii) : A(ii) { }
      ~D() { }

};

int main() 
{
   D d1(45);
   D d2;
   cout << d1.getI() << endl;
   cout << d2.getI() << endl;
}
0 голосов
/ 19 февраля 2019

Как насчет добавления значения по умолчанию к конструкторам A, B, C, т.е.

A(int ii=0) :
0 голосов
/ 19 февраля 2019

Боюсь, что нет.При виртуальном наследовании ваш самый производный класс должен инициализировать виртуальную базу.

Подробнее здесь .

...