Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Приватное наследование


Автор: Larrr 16.1.2010, 20:13
Привет! Разбираюсь тут с ООП в С++. Попробовала написать такой пример:

Код

#include <iostream>
using namespace std;

class A {
  public:
    A();
};

class B : private A {
};

A::A() {
  cout << "I'm A constructor\n";
}

int main() {
  A a;
  B b;
}



На выходе имеем:

I'm A constructor
I'm A constructor

Посему вопроса 2:

1) Почему, когда В унаследовался от А приватно, конструктор В (изначалько конструктор предка А) не сделался приватным?
2) В каких случаях потомок наследует, а в каких не наследует конструктор родителя?


Спасибо!  smile 

Автор: NightmareZ 16.1.2010, 20:32
Конструктор не наследуется.

Добавлено через 39 секунд
Конструктор не наследуется.

Автор: andrew_121 16.1.2010, 20:54
Цитата(Larrr @  16.1.2010,  20:13 Найти цитируемый пост)
1) Почему, когда В унаследовался от А приватно, конструктор В (изначалько конструктор предка А) не сделался приватным?

с чего вы взяли? ;)

Цитата(Larrr @  16.1.2010,  20:13 Найти цитируемый пост)
2) В каких случаях потомок наследует, а в каких не наследует конструктор родителя?

ответьте на первый вопрос, и в этом вопросе надобность пропадет.

Автор: mes 16.1.2010, 20:56
конструкторы не наследуются
если нет явного вызова конструктора предка, вызывается конструктор по умолчанию.


Автор: Larrr 16.1.2010, 21:31
andrew_121 :

1) Потому, что я пребываю в уверенности (возможно, необоснованной), что нельзя создать объект, у которого есть только приватный конструктор. По результату вызова В b; видно, что вызвался конструктор родителя, который, по идее, должен бы быть приватным. Почему вызывается приватный конструктор? Я бы еще поняла, если бы вызвался конструктор по умолчанию...

2) Не пропала.

mes:  Мой пример показывается, что при создании В вызывается конструктор А. Те. наследуется конструктор родителя.

Автор: saneea 16.1.2010, 21:45
Larrr, приватное наследование моделирует отношение "использует" (или "реализуется при помощи"), а открытое наследование моделирует отношение "является разновидностью". То есть: класс B использует класс A как "вспомогательный" механизм. При этом в функциях-членах класса B можно использовать ОТКРЫТЫЕ функции-члены и данные. Другими словами, вы могли бы написать код так:

Код

class A {
  public:
    A();
};

class B {
  A A_m;
};

A::A() {
  cout << "I'm A constructor\n";
}

int main() {
  A a;
  B b;
}


И призошло бы то же самое, хоть A_m определено в приватной секции!

Цитата

Я бы еще поняла, если бы вызвался конструктор по умолчанию...


Любой конструктор не принимающий параметров называется "конструктор по умолчанию" (независимо от того, вы его написали, или его сгенерировал компилятор).

Автор: zim22 16.1.2010, 21:46
Цитата(Larrr @  16.1.2010,  20:31 Найти цитируемый пост)
при создании В вызывается конструктор А. Те. наследуется конструктор родителя.

неправильный логический вывод.

P = при создании В вызывается конструктор А (ИСТИНА)
Q = при создании В наследуется констуктор А (ЛОЖЬ)

P                Q 
ИСТИНА  ЛОЖЬ

(P => Q) ЛОЖЬ

smile


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)