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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли отменить конструктор родителя? если да, то как? 
:(
    Опции темы
wowka19
Дата 11.3.2012, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код


class A {
protected:
    int data;
public:
    A() { data = 0; }
    A(int d) { data = d; }
};

class B : public A {
public:
    B() {}
    B(int d) { data = d*2; }
};



При
Код

B b(3);

срабатывает A(); а мне допустим этого не надо.. Даже при том, что реализация B(int) или B() срабатывает после A() и все можно переопределить, то зачем мне тратить такты ЦП впустую...

И еще вопрос.
Если при наследовании меня устраивает работа конструктора с параметрами родительского класса, т.е. A(int), то как мне им воспользоваться для инициализации потомка? или придется тупым копипастом реализовать такой же конструктор в классе B?
PM MAIL   Вверх
borisbn
Дата 11.3.2012, 15:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 21
Всего: 135



Цитата(wowka19 @  11.3.2012,  15:44 Найти цитируемый пост)
Если при наследовании меня устраивает работа конструктора с параметрами родительского класса, т.е. A(int), то как мне им воспользоваться для инициализации потомка?

Код

B( int d ) : A( d ) {}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Dem_max
Дата 11.3.2012, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 4
Всего: 39



Цитата

срабатывает A(); а мне допустим этого не надо..

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





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
wowka19
Дата 11.3.2012, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



borisbn, спасибо.

А первый вопрос не решаем?

Добавлено через 7 минут и 33 секунды
Dem_max, ОК. спасибо.

borisbn, а если это касается конструктора копирования? здесь то
Код

B( B obj ) : A( obj ) {}

не прокатит - типы разные.
PM MAIL   Вверх
wowka19
Дата 11.3.2012, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Появилась основная ПРОБЛЕМА!

в родительском классе я реализовал операции = и +
однако в потомках они не работают так  как возвращают объект типа родительского класса, а конструктор копирования или оператор присваивания потомка ожидают объект своего типа.
Как быть такой ситуации?
Неужели придется заново переопределять конкатенацию (+) и присваивание (=) ?

PM MAIL   Вверх
mes
Дата 11.3.2012, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



wowka19,  опишите основную задачу, может там наследование и не нужно.. 



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


Опытный
**


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

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



задание:
1.
реализовать класс String;
который хранит строку  - char * data;
и имеет операции сравнения строк (<,>,==,!=,<=,>=)
а также конкатенацию (+) и присваивание (=).

2.
Наследовать от него класс HexString;
который следит за корректностью хранимых данных. То есть этот класс будет отличаться от родителя String только тем, что будет обнулять буфер data если он хранит не шестнадцатеричные символы.

Я сделал класс String.
Но в наследуемом им HexString не работают корректно = и + по понятным причинам.
То есть
                HexString1 + HexString2 работает,
а вот
                 HexString3 = HexString1 + HexString2 и HexString3(HexString1 + HexString2)  не работают

так как = и + возвращают объект типа String в то время как HexString::HexString(const HexString &) ожидает объект типа HexString.

Можно все нафиг перереализовать в классе HexString, но это как неправильно...

Это сообщение отредактировал(а) wowka19 - 11.3.2012, 17:39
PM MAIL   Вверх
maxim1000
Дата 11.3.2012, 18:34 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 1
Всего: 110



и прут, и прут это наследование куда только могут...

использование наследования здесь никакого смысла не имеет

обычно наследование применяют, если один класс выполняет все обещания базового
в данном случае класс String не имеет ни намёка на ограничения на используемые символы
поэтому, если ссылку на него передают в какую-нибудь функцию, она вправе ожидать, что "123"+"qqq" даст "123qqq", а не ""

нужно чётко понять, зачем здесь наследование

если просто для устранения дубликации кода - использовать приватное наследование (которое, по сути, не является наследованием в общепринятом понимании)



--------------------
qqq
PM WWW   Вверх
mes
Дата 11.3.2012, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(wowka19 @  11.3.2012,  16:37 Найти цитируемый пост)
Наследовать от него класс HexString;
который следит за корректностью хранимых данных


Цитата(maxim1000 @  11.3.2012,  17:34 Найти цитируемый пост)
и прут, и прут это наследование куда только могут...
использование наследования здесь никакого смысла не имеет


 smile , не проще просто валидатор сделать ?



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


Опытный
**


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

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



не могу с вами не согласиться, ибо то что вы говорите более чем очевидно... но есть одна маленькая, но очень важная ФИГНЯ:
это требуется ПО ЗАДАНИЮ!
вопрос открыт....(
PM MAIL   Вверх
bsa
Дата 12.3.2012, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



wowka19, для класса HexString тоже надо писать свои конструктор копирования, оператор присваивания, конкатенации и пр.
PM   Вверх
wowka19
  Дата 12.3.2012, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вроде выкрутился..
добавил в HexString конструктор копирования для родительского класса:
Код

HexString(const String &);

и добавил на всякий случай
Код

HexString & operator =(const HexString &);


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

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

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

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

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

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


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

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


 




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


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

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