Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Неразобрался с наследованем |
Автор: Programister0 4.6.2007, 14:24 | ||||||||
допустим есть шаблон класса
и есть два предка от этого класса первый:
втрой:
а вот и вопрос: надо создать класс включающий в себя всё из предыдущих 3-х классов
вообще возможно ли как нибудь попроще написать чтото подобное? |
Автор: Rockie 4.6.2007, 20:15 | ||||
Programister0, вроде бы imho никакие.. У базовых классов есть конструкторы по умолчанию, поэтому явно вызывать конструкторы предков нет необходимости.
imho в С++ вообще нужны деструкторы. Если ты не объявишь его, компилятор сам его сгенерирует. |
Автор: Programister0 4.6.2007, 23:20 | ||||||
оговорился т.е. опечатался?
пнятно я писал это в 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 4.6.2007, 23:35 | ||||
Используй виртуальное наследование, т.е.
Читай про это например http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.9 |
Автор: Damarus 5.6.2007, 07:22 | ||
Rockie, ты это загнул ![]() |
Автор: Rockie 5.6.2007, 13:04 |
Damarus, хе)) Ну так оно и есть ![]() |
Автор: Damarus 5.6.2007, 17:07 |
default destructor - это конечно да, только я про первую часть ![]() |
Автор: Rockie 5.6.2007, 17:40 |
Damarus, а, это мы легко ![]() |
Автор: Programister0 5.6.2007, 18:19 | ||||
вроде так, если правильно понял но получилось ещё хуже 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 5.6.2007, 20:30 |
В классах с виртуальными функциями или в наследованых классах есть еще указатель на таблицу виртуальных методов (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 в общем всё правильно ![]() Почитай дальше по ссылке, там есть примеры, например когда класс использует виртуальный метод дочернего класса, итд. А вообще множественное наследование нужно использовать осторожно, только в особых случаях и если знаешь что делаешь ![]() |
Автор: archimed7592 6.6.2007, 00:27 | ||||||||||
если не ошибаюсь, писать нужно так:
ты получишь то же самое, что если написал бы
![]() ![]() ![]() |
Автор: Programister0 6.6.2007, 12:00 | ||
большое спасибо вам о великие программеры: archimed7592, nickless, Rockie, Damarus; я вроде догнался с наслеованием и virtual'ами, - буду использовать только в крайних случаях, но в своих классах: никогда - эт. точно; И ещё что это у вас тут за система
мне типа надо нажать эти + | — - если понравились/помогли ответы, к чему все это. ещё раз спасибо всем, вы мне очень помогли. |