powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Множественно наследование
11 сообщений из 36, страница 2 из 2
Множественно наследование
    #34251382
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПотому что A2 не является наследником A1как так?
...
Рейтинг: 0 / 0
Множественно наследование
    #34251468
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Это только с виду. А так - дебилизм. Зачем нужен шаблон, если он не использует
своего параметра ?

Дело в том, что в исходно предложенной реализации классы
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

В этом и выявляется + который и дает в данном случае шаблон. Ты жестко прописал для A2 предка A1. Если сделать наследником некий другой A1~, то реализацию всего A2 надо копировать. Шаблон же автоматизирует эту работу.

Мысля появилась. А если убрать шаблон и пронаследовать от в всех A1n? Что будет с одноименными методами в С++ при множественном наследование не знаю, но минус будет в том, что если добавиться новый A1x, то A2 прийдется измянть. Шаблон же автоматом все подцепит.
...
Рейтинг: 0 / 0
Множественно наследование
    #34252283
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Это только с виду. А так - дебилизм. Зачем нужен шаблон, если он не использует
своего параметра ?

Ась ? Как не использует ?
Код: plaintext
template  <class T>  class A2 :  public T   {
...
Рейтинг: 0 / 0
Множественно наследование
    #34252966
А если убрать шаблон и пронаследовать от в всех A1n? Что будет с одноименными методами в С++ при множественном наследование не знаю, но минус будет в том, что если добавиться новый A1x, то A2 прийдется измянть. Шаблон же автоматом все подцепит.

конфликты имен при множественном наследовании все равно придется разрешать явно кодированием

так что шаблоны, без вариантов (если я правильно понял задачу)
вот только я бы сделал через шаблон-генератор прокси (идеома PIMPL)
как-то так:

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
#include <iostream>

class Impl
{

//...

public: // собственно реализация всех методов:

void a1() { std::cout << "a1()\n"; }
//...
void an() { std::cout << "an()\n"; }

};

class A1
{
public: // подмножество сигнатур из a1 .. an:

virtual void a1() =  0 ;
//...

};

class AN
{
public: // подмножество сигнатур из a1 .. an:

virtual void an() =  0 ;
//...

};

template <class AI> class ProxyImpl: public AI
{
private:

Impl* _pImpl;

// реально нужно так:
// shared_ptr<Impl> pImpl;

public:

ProxyImpl(): _pImpl( new Impl ) {}

template < class newAI > friend class ProxyImpl;
template < class newAI >
ProxyImpl( const ProxyImpl<newAI>& newProxyImpl ): _pImpl( newProxyImpl._pImpl ) {}

public: // переадресация для вызова всех методов:

void a1() { _pImpl->a1(); }
//...
void an() { _pImpl->an(); }

};

int main()
{
	ProxyImpl<A1> pra1;
	A1* pa1 = static_cast<A1*>( &pra1 );
	pa1->a1();

	ProxyImpl<AN> praN( pra1 );
	AN* paN = static_cast<AN*>( &praN );
	paN->an();

	return  0 ;
}


если что накосячил, извиняте - лепил наскоро
указатель нужен "умный", со счетчиком ссылок
...
Рейтинг: 0 / 0
Множественно наследование
    #34254044
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:
> В этом и выявляется + который и дает в данном случае шаблон. Ты жестко
> прописал для A2 предка A1. Если сделать наследником некий другой A1~, то
> реализацию всего A2 надо копировать. Шаблон же автоматизирует эту работу.
>
> Мысля появилась.

Тут вообще не должно быть никаких мыслей. Тебе надо определить
абстрактные методы - нужно наследование. Все.

Если у тебя были какие-то другие мысли, они были неправильные.

А если убрать шаблон и пронаследовать от в всех A1n?

> Что будет с одноименными методами в С++ при множественном наследование
> не знаю, но минус будет в том, что если добавиться новый A1x, то A2
> прийдется измянть. Шаблон же автоматом все подцепит.

Голенков Владимир пишет:

> конфликты имен при множественном наследовании все равно придется
> разрешать явно кодированием

Суть-то в том, что не нужно здесь множественное наследование.

> так что шаблоны, без вариантов (если я правильно понял задачу)
> вот только я бы сделал через шаблон-генератор прокси (идеома PIMPL)
> как-то так:

Какова задача ?

"Есть класс, которой содержит абстрактные методы, есть другой, который их
реализует. Наиболее простой способ их склеивания ..."

Это реализуется наследованием реализующего класса от класса, объявляющего
методы. Все остальные решения не соответствуют уровню сложности задачи.
(она проста, а решения предлагаются сложные).

Ну и вообще хочется спросит афтара - а что надо то вообще ?
Нужно реализовать - наследуйся, какие проблемы ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Множественно наследование
    #34254061
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я невнимательно читал топик. Действительно шаблоны нужны если надо реализовать методы разных базовых классов с помощью только одного.

Но проблема еще и в том, что если написать

template <class AI> class AIImpl: public AI
{
virtual void method1(...) { ... }
virtual void method2(...) { ... }
virtual void method3(...) { ... }

};

то методы method1, method2, method3 в этом случае будут соотносится с методами
базового класса только по названиям и сигнатурам.
В любом случае каждый класс AI будет требовать только определенных методов (если их будет нехватать, AIImpl определит лишние, если будет много, то AIImpl-а будет недостаточно).

Почему бы не написать для каждого класса AI свою имплементацию ?

class AI1 {
virtual void method1(...) =0;
virtual void method2(...) =0;
virtual void method3(...) =0;
}

class AI1Impl : public AI1 {
virtual void method1(...){}
virtual void method2(...){}
virtual void method3(...){}
}

class AI2 {
virtual void method3(...) =0;
virtual void method4(...) =0;
virtual void method5(...) =0;
}

class AI2Impl : public AI2 {
virtual void method3(...){}
virtual void method4(...){}
virtual void method5(...){}
}
...
Рейтинг: 0 / 0
Множественно наследование
    #34254822
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир...
вот только я бы сделал через шаблон-генератор прокси (идеома PIMPL)
...


В принципе, да. Как вариант. В моем случае не вижу смысла в, отделении волков от овец.
...
Рейтинг: 0 / 0
Множественно наследование
    #34254827
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv...
Почему бы не написать для каждого класса AI свою имплементацию ?

class AI1 {
virtual void method1(...) =0;
virtual void method2(...) =0;
virtual void method3(...) =0;
}

class AI1Impl : public AI1 {
virtual void method1(...){}
virtual void method2(...){}
virtual void method3(...){}
}

class AI2 {
virtual void method3(...) =0;
virtual void method4(...) =0;
virtual void method5(...) =0;
}

class AI2Impl : public AI2 {
virtual void method3(...){}
virtual void method4(...){}
virtual void method5(...){}
}

Потому-то просто копирование кода. Любое изменение (исправление глюка), повлечет за собой необходимость изменять все копии. Да и, вообще, не красиво, сложно, не интересно, не профессионально, ... . Я как раз с этим и борюсь.
...
Рейтинг: 0 / 0
Множественно наследование
    #34255082
В принципе, да. Как вариант. В моем случае не вижу смысла в, отделении волков от овец.

я пример привел с целью прояснения самой задачи, потому как честно говоря не въехал поначалу что к чему %)

пара замечаний:

1) по-моему, в случае PIMPL плюсы (большее абстагирование, "легкое" копирование) превышают минусы (дополнительная косвеность вызовов методов) особенно в случае громоздкого класса реализации

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

я пример привел с целью прояснения самой задачи, потому как честно говоря не въехал поначалу что к чему %)

пара замечаний:

1) по-моему, в случае PIMPL плюсы (большее абстагирование, "легкое" копирование) превышают минусы (дополнительная косвеность вызовов методов) особенно в случае громоздкого класса реализации

2) в интерфейсах AI деструкторы нужно сделать защищенными во избежания соблазна delete AI

Абсолютно согласен со всем. Единственное, планку в 1) я бы немного сдвинул.

Один вопрос. Данная схема также использует наследование от шаблона. Статик каст, мне кажется не нужен. Использование более простое.
...
Рейтинг: 0 / 0
Множественно наследование
    #34255206
Статик каст, мне кажется не нужен

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


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