![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Programister0 |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
допустим есть шаблон класса
и есть два предка от этого класса первый:
втрой:
а вот и вопрос: надо создать класс включающий в себя всё из предыдущих 3-х классов
вообще возможно ли как нибудь попроще написать чтото подобное? |
||||||||
|
|||||||||
nickless |
|
||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Чтобы можно было использовать аттрибуты класса в потомках (например n в s0_1), они должны быть в секции protected.
Для s0 это потомки, предки они только для s1 Тут надо написать s0<TYPE>::n (это ИМХО изза шаблонов). В s0_2 к стати n тоже пару раз используется.
Не напишешь - будет protected s0_1<TYPE>() и s0_2<TYPE>() - т.е. всех классов, от которых наследуем. Заметь, что в этом случае, s1 будет иметь 2 копии всех аттрибутов и методов класса s0, и нужно будет явно указывать, через какой класс (s0_1 или s0_2) ты к ним хочешь обратится. Т.е. например s0_1<TYPE>::n и s0_2<TYPE>::n - это разные переменные. Нет.
Смотря что нужно, если обязательно множественное наследование и шаблоны - сомневаюсь ![]() -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||
|
|||||
Rockie |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Programister0, вроде бы imho никакие.. У базовых классов есть конструкторы по умолчанию, поэтому явно вызывать конструкторы предков нет необходимости.
imho в С++ вообще нужны деструкторы. Если ты не объявишь его, компилятор сам его сгенерирует. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||
|
|||||
Programister0 |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
оговорился т.е. опечатался?
пнятно я писал это в Builder'е он вроде понял, но возьму на заметку
вот в этом и пробема размер s0=8, s0_1=12 =s0+s0_1 s0_2=16 =s0+s0_2 s1=28 =s0+s0+s0_1+s0_2 как обьяснить компилятору что s0 нужна только в 1-м экземпляре в s1 если её(s0) функции не переопределяются в s0_1 и s0_2. благодарю за разьснение; |
||||||
|
|||||||
nickless |
|
||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Используй виртуальное наследование, т.е.
Читай про это например тут -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||
|
|||||
Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
||||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Damarus, хе)) Ну так оно и есть
![]() -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
default destructor - это конечно да, только я про первую часть
![]() |
|||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Damarus, а, это мы легко
![]() -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
Programister0 |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
вроде так, если правильно понял но получилось ещё хуже size(s0 )=8 size(s0_1)=16 //вместо 12 size(s0_2)=20 //вместо 16 size(s1 )=28 //вместо 20 как хотелось бы вот и второй вопрос: куда уходят по 4 байта в классах s0_1 и s0_2 что ещё дает это переопределие "virtual" в том примере из ссылки такая-же ситуация:
size(Base)=4 size(Der1)=8 //откуда ещё 4-е байта? size(Der2)=8 size(Join)=12 во втором примере без данных ещё хуже: size(Base)=4 size(Der1)=12 size(Der2)=12 size(Join)=20 |
||||
|
|||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
В классах с виртуальными функциями или в наследованых классах есть еще указатель на таблицу виртуальных методов (VMT), (это зависит от реализации и может быть по другому в разных компиляторах, но в большинстве это так). Т.е. size(s0<int> )=8 // TYPE* + DWORD = 4 + 4 size(s0_1<int>)=16 //VMT* + TYPE* + base = 4 + 4 + 8 size(s0_2<int>)=20 //VMT* + TYPE* + DWORD + base = 4 + 4 + 4 + 8 size(s1<int> )=28 //s0_1::VMT* + s01:(TYPE*) + s0_2::VMT* + s0_2:(TYPE* + DWORD) + base = 4 + 4 + 4 + 8 + 8 в общем всё правильно ![]() Почитай дальше по ссылке, там есть примеры, например когда класс использует виртуальный метод дочернего класса, итд. А вообще множественное наследование нужно использовать осторожно, только в особых случаях и если знаешь что делаешь ![]() -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
archimed7592 |
|
||||||||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
если не ошибаюсь, писать нужно так:
ты получишь то же самое, что если написал бы
![]() ![]() ![]() Это сообщение отредактировал(а) archimed7592 - 6.6.2007, 00:27 -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
||||||||||
|
|||||||||||
Programister0 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.5.2007 Репутация: нет Всего: нет |
большое спасибо вам о великие программеры: archimed7592, nickless, Rockie, Damarus;
я вроде догнался с наслеованием и virtual'ами, - буду использовать только в крайних случаях, но в своих классах: никогда - эт. точно; И ещё что это у вас тут за система
мне типа надо нажать эти + | — - если понравились/помогли ответы, к чему все это. ещё раз спасибо всем, вы мне очень помогли. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |