powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Множественно наследование
25 сообщений из 36, страница 1 из 2
Множественно наследование
    #34243477
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть класс, которой содержит абстрактные методы, есть другой, который их реализует. Наиболее простой способ их склеивания

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
class A1 {
    protected:
        virtual void a() =  0 ;
};

class A2 {
    protected:
        virtual void a() {};
};

class B : public A1, public A2 {
};

int main () {

    B b;

    return  0 ;
}


не прокатывает ибо:
автор
c.cpp:28: error: cannot declare variable `b' to be of type `B'
c.cpp:28: error: because the following virtual functions are abstract:
c.cpp:15: error: virtual void A1::a()



Как элегантно решить эту проблему?
...
Рейтинг: 0 / 0
Множественно наследование
    #34243503
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отнаследовать A2 от A1 не могу, т.к. в качестве A1 подставляется несколько классов, из них лепяться другие.
...
Рейтинг: 0 / 0
Множественно наследование
    #34243570
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем, прихожу к выводу, что все таки наследовать A2 нельзя. Прийдется его создавать совойством класса и связывать все виртуальные функции. Не красиво по моему.

А если бы A2 имел абстрактные обвязки на A1? Такая схема, вообще, не возможна?
...
Рейтинг: 0 / 0
Множественно наследование
    #34243754
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhЕсть класс, которой содержит абстрактные методы, есть другой, который их реализует.

class B : virtual public A1, virtual public A2 { ... };
...
Рейтинг: 0 / 0
Множественно наследование
    #34243772
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv AkhЕсть класс, которой содержит абстрактные методы, есть другой, который их реализует.

class B : virtual public A1, virtual public A2 { ... };

ничего не поменялось:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
class A1 {
    protected:
        virtual void a() =  0 ;
};

class A2 {
    protected:
        virtual void a() {};
};

class B : virtual public A1, virtual public A2 {
};

int main () {

    B b;

    return  0 ;
}




rm -f c
g++ -Wall c.cpp -o c
c.cpp: In function `int main()':
c.cpp:28: error: cannot declare variable `b' to be of type `B'
c.cpp: 28 : error:   because the following virtual functions are abstract:
c.cpp: 15 : error:        virtual void A1::a()

...
Рейтинг: 0 / 0
Множественно наследование
    #34243865
Тынц.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class A1 {
    protected:
        virtual void a() =  0 ;
};

class A2 {
    protected:
        virtual void a() { ShowMessage("A2"); };
};

class B : virtual public A1, virtual public A2 {
    protected:
        virtual void a() { A2::a(); };
};
???
...
Рейтинг: 0 / 0
Множественно наследование
    #34243876
Тынц.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точнее так: :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class A1 {
    protected:
        virtual void a() =  0 ;
};

class A2 {
    protected:
        virtual void a() {};
};

class B : virtual public A1, virtual public A2 {
    protected:
        virtual void a() { A2::a(); };
};
...
Рейтинг: 0 / 0
Множественно наследование
    #34244125
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вариант не покатит:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class A1 {
    protected:
        virtual void a() =  0 ;
};

class A2 : public A1{
    protected:
        virtual void a() {};
};

class B : public A2 {
};

int main () {

    B b;

    return  0 ;
}
...
Рейтинг: 0 / 0
Множественно наследование
    #34244592
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тынц.Точнее так: :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class A1 {
    protected:
        virtual void a() =  0 ;
};

class A2 {
    protected:
        virtual void a() {};
};

class B : virtual public A1, virtual public A2 {
    protected:
        virtual void a() { A2::a(); };
};


Примерно так и делаю, но проблема описана во втором моем сообщении. У меня 4 разных A1 от одного интерфейса с 7-ю виртуальными методами. Необходимо получить 4 класса B. Приходится вводить 28 лишних функций.
...
Рейтинг: 0 / 0
Множественно наследование
    #34244608
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SnowMan2А вариант не покатит:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class A1 {
    protected:
        virtual void a() =  0 ;
};

class A2 : public A1{
    protected:
        virtual void a() {};
};

class B : public A2 {
};

int main () {

    B b;

    return  0 ;
}



Нет. Так как классов A1 много. Все от одного интерфейса. Примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
class A1I {
   public:
       virtual void a1() =  0 ;
        ...
       virtual void an() =  0 ;
};

class A11 : public A1I {
   ....
}

...

class A1n : public A1I {
   ....
}

class A2 {
   public:
       virtual void a1();
        ...
       virtual void an();
}


Необходимо построить B1, ... Bn путем "скрещивания" A1x с A2.
...
Рейтинг: 0 / 0
Множественно наследование
    #34245991
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поскольку класс B абстрактный, нельзя создавать его объекты.
...
Рейтинг: 0 / 0
Множественно наследование
    #34245998
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoпоскольку класс B абстрактный, нельзя создавать его объекты.

А вставить функции из другого класса в абстрактные?

Как элегантно решить эту проблему?
...
Рейтинг: 0 / 0
Множественно наследование
    #34246026
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у ты какой. А может, их надо оставить абстрактными?
...
Рейтинг: 0 / 0
Множественно наследование
    #34246067
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoу ты какой. А может, их надо оставить абстрактными?

Я хочу их подменить из другого класса. Есть объекты A1x. Выполняют некоторую логику. Им надо ее как-то проявить. Проявить можно по разному, например через A21. А можно и по другому, например через A22 или A23, ... . Соответственно можно их склеивать в B11_21, и т.д. Но как их склеить не прописывая каждый раз ?
...
Рейтинг: 0 / 0
Множественно наследование
    #34246114
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм… а this им какой передавать? A21 требует указатель на А21, А22 – на А22, а ты хочешь метод А21 подменить методом А22, а они не взаимозаменяемы (получится, что ты применяешь метод А22 к А21). Низя.
...
Рейтинг: 0 / 0
Множественно наследование
    #34246140
LeonM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В конструкции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class A1 {
    protected:
        virtual void a() =  0 ;
};

class A2 {
    protected:
        virtual void a() {};
};

class B : virtual public A1, virtual public A2 {
};

int main () {
    B b;
    return  0 ;
}
класс B - абстрактный, т.к. метод A1::a() не имеет реализации. Можно его реализовать в самом классе B.
...
Рейтинг: 0 / 0
Множественно наследование
    #34246248
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoхм… а this им какой передавать? A21 требует указатель на А21, А22 – на А22, а ты хочешь метод А21 подменить методом А22, а они не взаимозаменяемы (получится, что ты применяешь метод А22 к А21). Низя.

Почему не взаимозаменяемы? Что это значит?

Может мы друг друга не понимаем?

Классы A1x - с абстрактными метордами, A2x - с реализацией этих методов.
Я хочу применить методы A2x, подменив ими методы из A1x. Путем множественного наследования получается единственная реализация метода. Из A1x берется абстрактный метод (необходимо его реализовать), из A2x берется реализация (конкретная реализация). Путем разных комбинаций предков из наборов A1x и A2x получаются разные классы комбинируя между собой некотороую логику и по разному проявляя свои результаты. Количество этих классов - произведение количества наборов классов A1x и A2x.
...
Рейтинг: 0 / 0
Множественно наследование
    #34246251
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonMВ конструкции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class A1 {
    protected:
        virtual void a() =  0 ;
};

class A2 {
    protected:
        virtual void a() {};
};

class B : virtual public A1, virtual public A2 {
};

int main () {
    B b;
    return  0 ;
}
класс B - абстрактный, т.к. метод A1::a() не имеет реализации. Можно его реализовать в самом классе B.

А реализация A2::a()?
...
Рейтинг: 0 / 0
Множественно наследование
    #34246288
Классы A1x - с абстрактными метордами, A2x - с реализацией этих методов.

если A1x представляет интерфейс A2x, то логично наследование A2x->A1x
далее B наследует A2x и т.д.

это классическая схема разделения интерфейса и реализации, а что вы пытаетесь изобрести малопонятно - нужен содержательный пример
...
Рейтинг: 0 / 0
Множественно наследование
    #34246297
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class A1 {
    protected:
        virtual void a() =  0 ;
};

template <class T> class A2:public T  {
    protected:
        virtual void a() {};
};

int main () {

    A2<A1> b;

    return  0 ;
}

...
Рейтинг: 0 / 0
Множественно наследование
    #34246320
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир Классы A1x - с абстрактными метордами, A2x - с реализацией этих методов.

если A1x представляет интерфейс A2x, то логично наследование A2x->A1x
далее B наследует A2x и т.д.

это классическая схема разделения интерфейса и реализации, а что вы пытаетесь изобрести малопонятно - нужен содержательный пример

Класс A0 - интерфейс
Классы A1x - реализация интерфесов A0, которые собой представляют новые интерфейсы. 3 из них имеют 4 абстактных метода, и один - теже 4 + еще 3 метода.
Классы A2x - классы реализующие эти методы.

Фактически Классы A1x - разные интерфейсы, но отличаются только количеством необходимых функций из некоторой области. Т.е. можно сказать из некоторого обширного интерфейса. Но для некоторых классов полная реализация всех области функций не нужна.

Хочу найти простое (красивое, элегантное, ...) средство наложения функций из некоторого класса на абстрактные функции из классов (интерфейсов) A1x. Причем этот некоторый класс A2n может применяться несколько раз, столько сколько необходимо организовать с его учатстием склеек с классами A1n.
...
Рейтинг: 0 / 0
Множественно наследование
    #34246325
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneА так ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class A1 {
    protected:
        virtual void a() =  0 ;
};

template <class T> class A2:public T  {
    protected:
        virtual void a() {};
};

int main () {

    A2<A1> b;

    return  0 ;
}



С виду гениально! Надо попробовать. :)
...
Рейтинг: 0 / 0
Множественно наследование
    #34246333
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhХочу найти простое (красивое, элегантное, ...) средство наложения функций из некоторого класса на абстрактные функции из классов (интерфейсов) A1x. Причем этот некоторый класс A2n может применяться несколько раз, столько сколько необходимо организовать с его учатстием склеек с классами A1n.Шаблоны :)
...
Рейтинг: 0 / 0
Множественно наследование
    #34246580
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone AkhХочу найти простое (красивое, элегантное, ...) средство наложения функций из некоторого класса на абстрактные функции из классов (интерфейсов) A1x. Причем этот некоторый класс A2n может применяться несколько раз, столько сколько необходимо организовать с его учатстием склеек с классами A1n.Шаблоны :)

Да. Действительно. Знал, что должно быть решение, но слона не заметил. :)
...
Рейтинг: 0 / 0
Множественно наследование
    #34251364
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:

> class A1 {
> protected:
> virtual void a() = 0;
> };
>
> template <class T> class A2 : public T {
> protected:
> virtual void a() {};
> };

> С виду гениально!

Это только с виду. А так - дебилизм. Зачем нужен шаблон, если он не использует
своего параметра ?

Дело в том, что в исходно предложенной реализации классы
A1 и A2 оба имеют РАЗНЫЕ методы
virtual void a()
и A2 НЕ ПЕРЕОПРЕДЕЛЯЕТ метод из A1, а создает свой собственный.
Потому что A2 не является наследником A1, т.е. вообще ничего
не знает о A1. Для того чтобы A2 реализовал (переопределял) методы
A1, он должен быть унаследован от A1 :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class A1 {
     protected:
         virtual void a() =  0 ;
};

class A2 : virtual public A1 { // virtual нужно только для первого случая 
реализации B.
     protected:
         virtual void a() {};
};

class B : virtual public A1, virtual public A2 {};

// или

class B : public A2 {};


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Множественно наследование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]