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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> А можно ли унаследовать 2 класса, у которых один родитель? 
:(
    Опции темы
viii
Дата 1.8.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот что хотелось бы получить:
Код

class TPin{
protected:
    volatile uint8_t* pin;
    volatile uint8_t* ddr;
    volatile uint8_t* port;
    uint8_t pin_num;

    TPin(volatile uint8_t* base, uint8_t pin_num);
};

class TOutputPin: public TPin{
public:
    TOutputPin(volatile uint8_t* base, uint8_t pin_num);
    bool operator = (bool val);
};

class TInputPin: public TPin{
public:
    TInputPin(volatile uint8_t* base, uint8_t pin_num);
    operator bool();
};

class TBidirectionalPin: public TOutputPin, TInputPin{
    enum{
        DirOut,
        DirIn
    };
    TBidirectionalPin(volatile uint8_t* base, uint8_t pin_num, uint8_t dir) : TPin(base, pin_num) { Direction(dir) };
    using TOutputPin::operator =;
    using TInputPin::operator bool;
    void Direction(uint8_t dir);
};


т.е. Bidirectional должен обладать методами Input и Output и добавлять свой метод
ума не приложу, как тут можно поступить.
не хотелось бы наследовать здесь TPin и реализовывать отдельно методы, существующие в TInpuPin и TOutputPin.
возможно, лучше перенести все методы в TPin а в его потомках (TInputPin, TOutputPin и TBidirectionalPin) закрыть доступ к некоторым методам?
только как это сделать?
PM MAIL   Вверх
zim22
Дата 1.8.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(viii @  1.8.2009,  14:17 Найти цитируемый пост)
возможно, лучше перенести все методы в TPin а в его потомках (TInputPin, TOutputPin и TBidirectionalPin) закрыть доступ к некоторым методам?только как это сделать?

или через private наследование или через композицию.
***
вот пример с private наследованием:
Код

class Base {
public:  
  void f1() { }
  void f2() { }
};

class Derived1 : private Base {
public:
  void f1() { Base::f1(); }
};

class Derived2 : private Base {
public:
  void f2() { Base::f2(); }
};

***
вот пример с композицией:
Код

class Base {
public:  
  void f1() { }
  void f2() { }
};

class Derived1 {
public:
  void f1() { b_.f1(); }
private:
  Base b_;
};

class Derived2 {
public:
  void f2() { b_.f2(); }
private:
  Base b_;
};


Это сообщение отредактировал(а) zim22 - 1.8.2009, 14:32


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


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


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

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



судя по коду Вам вместо двойного наследования больше подойдет вариант с наследованием общей реализации:

Код

class TPinTemplate
{
    public:
      void input_impl ();
      void common_impl ();
      void output_impl ();
};
// так:
class TInputPin : protected TPinTemplate
{
    public:
       using TPinTemplate::common_impl;
       using TPinTemplate::input_impl;
};
// или так 
class TInputPin : protected TPinTemplate
{
    public:
       void common_iface () { ...; common_impl(); }
       void input_iface ()  { ...; input_impl(); }      
};



Это сообщение отредактировал(а) mes - 1.8.2009, 16:16


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


Новичок



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

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



Нравится предпоследний вариант. Может все-таки можно как-то с двойным наследованием?
PM MAIL   Вверх
mes
Дата 1.8.2009, 21:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(viii @  1.8.2009,  20:20 Найти цитируемый пост)
Нравится предпоследний вариант. Может все-таки можно как-то с двойным наследованием? 

можно, но зачем ? 

Код

class TPin {
};
class TIncomPin: virtual public TPin {
};
class TOutputPin : virtual public TPin {
};
class BiPin : public TIncomPin, public TOutputPin{
};





--------------------
PM MAIL WWW   Вверх
bsa
Дата 2.8.2009, 18:26 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



viii, виртуальное наследование (вариант от mes) это такой костыль, который очень часто показывает, что у тебя что-то не так запроектировано... Другими словами, в твоем случае не было необходимости делить на столько классов.
Нужно было сразу делать Bidirectional. Очень мало случаев, когда может понадобиться функционал, который ты реализуешь.

Как вариант, можно сделать класс для низкоуровневой работы с портом (открыть/закрыть, читать/писать) и еще два, которые работают с этим классом, но вводят дополнительные высокоуровневые методы для чтения и записи соответственно. В этом случае действительно можно безболезненно объединить эти классы в один наследованием. Единственное, что в этом случае будет дублироваться - указатель на класс низкоуровневой работы, но сам объект будет общим.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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