C ++ Inheritance Exercise - PullRequest
       4

C ++ Inheritance Exercise

3 голосов
/ 06 января 2011
      Class One : public Two
        {
        public:
           One()
           {
              Three three;
              cout << "something";
           }
        private:
           Four _four;
       };

Мне нужно отобразить предложение: «Раз, два, три, пять, пять, семь, семь» и первый класс должен остаться таким, какой он есть.Каждый класс не может отображать более одного слова в своем конструкторе и деструкторе.

Итак ... я понял, что моим базовым классом является четвертый класс.Я также сделал constr.& Destr.в каждом классе и пытался написать что-то в их теле, но вот что я получил на выходе:

Class Four Constructor:
Class Three Constructor:
Class Two Constructor:
Class Four Constructor:
Class Four Constructor:
Class Three Constructor:
Class One Constructor:
Class Three Destructor:
Class Four Destructor:

DESTRUCTION:
Class One Destructor:
Class Four Destructor:
Class Two Destructor:
Class Three Destructor:
Class Four Destructor:

моя основная функция:

int main()
{
 One one; //<----  it also have to remain
 cout << endl;
 cout << "DESTRUCTION:\n";
}

Я прочитал несколько статей о наследованиино до сих пор не знаю, как отображать слова в классах constr.& деструкторы, но не делайте этого дважды или более, даже если я создаю объекты этих классов, как это делается в классе 1.

PS Извините за грамматику и другие ошибки;)

Ответы [ 5 ]

4 голосов
/ 06 января 2011

Что мы можем вывести, основываясь исключительно на известном определении One (и моем воспоминании о правилах построения C ++, которые могут быть не точными на 100% :-), без учета каких-либо дополнительных возможных отношений наследования между классами:

  1. вывод Two() (являющийся конструктором базового класса) идет перед выводом всех других конструкторов,
  2. вывод Four() (принадлежащий членудалее идет производный класс),
  3. , затем вывод Three() (локальный объект в конструкторе One()),
  4. , затем вывод самого One(),
  5. затем вывод ~Three() (будучи локальной переменной, он выходит из области видимости при возврате из One()).

И вот здесь мы построили наш блестящий объект One.Так как мы мало что можем с этим поделать, давайте уничтожим это!Обратите внимание, что все объекты уничтожаются точно в порядке, обратном их порядку постройки;это фундаментальное правило C ++.Таким образом,

  1. сначала выводится ~Four() (поскольку члены уничтожаются раньше, чем их владелец),
  2. (потом выводится несуществующий ~One(), как производнаячасть класса уничтожается до его базовой части),
  3. , затем вывод ~Two(), поскольку базовая часть уничтожается последней.

Это дает вам ровно семь возможных чиселвывод, таким образом, вам не нужно никаких дополнительных базовых классов или членов в любом месте.Просто поместите правильные числа в вывод правильных конструкторов и деструкторов: -)

1 голос
/ 06 января 2011

Хорошо, это сделано:] Спасибо за ваши ответы, особенно Петер Тёрёк:)

class Two
{
public:
    Two()
    {
        cout << "Class Two Constructor: ONE" << endl;
    }
    ~Two()
    {
        cout << "Class Two Destructor:" << endl;
    }
};

class Three
{
public:
    Three()
    {
        cout << "Class Three Constructor: THREE" << endl;
    }
    ~Three()
    {
        cout << "Class Three Destructor: FIVE" << endl;
    }
};

class Four
{
public:
    Four()
    {
        cout << "Class Four Constructor: TWO" << endl;
    }
    ~Four()
    {
        cout << "Class Four Destructor: SEVEN" << endl;
    }
};


class One: public Two
{
public:
    One()
    {
        Three Three;
        cout << "Class One Constructor: FOUR" << endl;
    }
    ~One()
    {
        cout << "Class One Destructor: SIX" << endl;
    }
private:
    Four _Four;
};

и вывод:

Class Two Constructor: ONE
Class Four Constructor: TWO
Class Three Constructor: THREE
Class One Constructor: FOUR
Class Three Destructor: FIVE

DESTRUCTION:
Class One Destructor: SIX
Class Four Destructor: SEVEN
Class Two Destructor:
1 голос
/ 06 января 2011

Вы отметили это как домашнее задание, поэтому я не собираюсь говорить вам ответ ...

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

Некоторые вопросы:

  • У которого тело выполнено первым, конструктор производного класса или база конструктор класса? А как насчет деструкторов?
  • Является ли конструктор для члена переменная выполняется перед конструктор для содержащего класса? Что насчет деструкторов?

Я предлагаю начать с простого примера. Два класса, каждый с конструктором и деструктором, один подкласс от другого. Напечатайте что-нибудь в каждой функции и посмотрите на порядок. Затем добавьте другой класс и сделайте его переменной-членом. Что происходит?

Поскольку вы должны вывести нечетное количество слов, один класс должен будет печатать только в своем конструкторе или деструкторе, но не в обоих.

Кстати, в вашем вопросе класс Four не является базовым классом.

Удачи!

0 голосов
/ 06 января 2011

Также поймите это -

Из Стандартных документов, Удалить,

В первом варианте (удалить объект), если статический тип операнда отличается от его динамического типастатический тип должен быть базовым классом динамического типа операнда, а статический тип должен иметь виртуальный деструктор или поведение не определено.

0 голосов
/ 06 января 2011

Возможно, вы пытаетесь выяснить порядок вызова конструкторов. Когда вы вызываете конструктор, конструктор суперкласса выполняется первым (обратите внимание, что мне удобнее с Java, чем с C ++, поэтому будьте осторожны здесь). Поэтому, если One наследует от Two, который наследует от Three, и вы вызываете конструктор One, то порядок будет такой: Three, Two, One.

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