Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приватное наследование, Объясните пожалуйста как работает 
:(
    Опции темы
Larrr
Дата 16.1.2010, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 29.1.2006
Где: Прага

Репутация: нет
Всего: 2



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

Код

#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 
PM MAIL WWW ICQ   Вверх
NightmareZ
Дата 16.1.2010, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 0
Всего: 13



Конструктор не наследуется.

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


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
andrew_121
Дата 16.1.2010, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



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

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

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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 16.1.2010, 20:56 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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




--------------------
PM MAIL WWW   Вверх
Larrr
Дата 16.1.2010, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 29.1.2006
Где: Прага

Репутация: нет
Всего: 2



andrew_121 :

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

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

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

Это сообщение отредактировал(а) Larrr - 16.1.2010, 21:31
PM MAIL WWW ICQ   Вверх
saneea
Дата 16.1.2010, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



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 определено в приватной секции!

Цитата

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


Любой конструктор не принимающий параметров называется "конструктор по умолчанию" (независимо от того, вы его написали, или его сгенерировал компилятор).
PM MAIL   Вверх
zim22
Дата 16.1.2010, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



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

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

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

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

(P => Q) ЛОЖЬ

smile




--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0823 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.