Множественное и виртуальное наследование C ++ - PullRequest
1 голос
/ 26 марта 2020

Полный отказ от ответственности, это домашнее задание - не оценивается, просто дается студентам, чтобы мы могли практиковаться. Я прошу помощи, потому что мы не получим ответ, и я просто хочу знать, как его решить.

Что я могу сделать, это определить структуры B и C. Их интерфейс должен быть «как интерфейс А, с изменениями, чтобы он работал правильно». Я не могу добавить какие-либо новые методы. Я также не могу ничего изменить в структуре A.

Это код:

#include <iostream>

struct A;
struct B;
struct C;

struct A {
    A() {
        std::cout << __PRETTY_FUNCTION__ << "\n";
    }
};

int main(){
    C c;
}

И желаемый вывод:

A::A()
A::A()
B::B()
A::A()
A::A()
B::B()
A::A()
C::C()

То, что я пытался сделайте так: сначала я начал так, просто чтобы проверить:

struct B : public A {
  B() : A() {
      std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};

struct C : public B {
  C() : B() {
      std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};

Что дало мне:

A::A()
B::B()
C::C()

Итак, я попытался сначала получить C, затем A затем B, A (желаемый вывод снизу):

struct B : public virtual A {
  B() : A() {
      std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};

struct C : public B, public A {
  C() : A(), B() {
      std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};

Но, конечно, это не сработало. (предупреждение: прямая база 'A' недоступна в 'C' из-за неоднозначности)

Добавление виртуального ключевого слова, как показано ниже, снова дало мне C, B, а затем A снизу:

struct B : public virtual A {
  B() : A() {
      std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};

struct C : public virtual A, public B {
  C() : A(), B() {
      std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};

Если я хочу получить C, то ИИ должен сделать следующее (но тогда не будет Б)

struct C : public virtual A {
  C() : A() {
      std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};

struct B : public virtual A, public C {
  B() : C(), A() {
      std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};

Я также понятия не имею, как я могу получить A :: A ( ) дважды подряд.

Я просто хочу понять, как это должно работать, но если вы все еще чувствуете, что не хотите помогать мне с решением, тогда, пожалуйста, оставьте мне несколько советов.

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Я не вижу ограничения в упражнении на использование учеников:

struct A
{
    A() { std::cout << __PRETTY_FUNCTION__ << "\n"; }
};

struct B : A
{
    B() { std::cout << __PRETTY_FUNCTION__ << "\n"; }
};

struct C
    : B
    , A
{
    C() { std::cout << __PRETTY_FUNCTION__ << "\n"; }

    B b;
    A a;
};

ОБНОВЛЕНИЕ

Желаемый результат изменился, так как мой первый ответ был вывешенный. Поэтому предыдущий ответ стал неправильным. Но теперь вы видите смысл - вы можете использовать композицию и скопировать A a; в B определение и удалить A наследование из C определения.

1 голос
/ 26 марта 2020

Вы можете сделать что-то вроде:

struct B : A { //inherit from A
    B() {
        A();
        std::cout << __PRETTY_FUNCTION__ << "\n";       
    }
};

struct C : B { //inherit from B
    C() {
        B();   //anonymous B object
        A();   //anonymous A object
        std::cout << __PRETTY_FUNCTION__ << "\n";
    }
};

Рабочий образец

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