Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
1

Абстрактные классы

11.09.2012, 22:15. Показов 775. Ответов 9
Метки нет (Все метки)

В общем есть у нас 2 абстрактных класса CA и CB и 2 дочерних от них класса CC и CD. Как сделать так чтобы CD наследовал CB поверх которого должен быть CC?
C++
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
#include <iostream>
 
class CA abstract {
    public:
        virtual void test( void ) = 0;
        virtual void fun( void ) = 0;
};
 
class CB abstract : public CA {
    public:
        virtual void new_test( void ) = 0;
        virtual void new_fun( void ) = 0;
};
 
class CC : public CA {
    public:
        void test( void ) { std::cout << "Call function cc.test();" << std::endl; }
        void fun( void ) { std::cout << "Call function cc.fun();" << std::endl; }
};
 
class CD : public CB {
    public:
};
 
int main () {
    std::cout << "Program:" << std::endl;
    CD cd;
    cd.test(); cd.fun(); cd.new_test(); cd.new_fun();
 
    while(true);
 
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2012, 22:15
Ответы с готовыми решениями:

Абстрактные классы
Ребята! Помогите с таким делом. Мне дали задание создать абстрактный класс Автомобиль, классы...

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

Абстрактные классы
Объясните пожалуйста почему это не работает и как исправить? cannot declare variable 'b1' to be...

Абстрактные классы
Помогите пожалуйста, сообразить не могу. Есть абстрактный класс. У него есть метод, чтение из...

9
2553 / 1318 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2012, 22:18 2
Цитата Сообщение от AndreaZzZ Посмотреть сообщение
Как сделать так чтобы CD наследовал CB поверх которого должен быть CC?
"Поверх которого" означает наследование CC от CB?
0
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
11.09.2012, 22:21  [ТС] 3
Да, но нельзя изменять CC.
0
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
11.09.2012, 22:22 4
Цитата Сообщение от AndreaZzZ Посмотреть сообщение
Как сделать так чтобы CD наследовал CB поверх которого должен быть CC?
Можно применить двойное наследование, только для каждого спорного момента тебе придется указывать явно какую версию ты хочешь использовать:
C++
1
2
3
4
class CD : public CB, public CC {
    public:
            using CC:some_func;
};
Пока у тебя вроде спорных моментов нет, но думаю что будет. А вообще не вижу ни намека на необходимость такого наследования.
з.ы. Хотя, если абстракты выступают исключительно как интерфейсы, то можно пока не париться
0
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
11.09.2012, 22:27  [ТС] 5
Как ни странно такая наследственность необходима. Представь что CA и CB это API какой-нибудь библиотеки, а CC и CD вносят нужные мне изменения в их бейсклассы.
0
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
11.09.2012, 22:28 6
Представил. Только зачем связывать CC и CD ?
0
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
12.09.2012, 16:07  [ТС] 7
CC (как и CA для CB) является дополнением, но иногда и само используется. Я не вижу смысла иметь две одинаковые записи в каждом классе.

C++
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
#include <iostream>
 
class CA abstract {
    public:
        virtual void test( void ) = 0;
        virtual void fun( void ) = 0;
};
 
class CB abstract : public CA {
    public:
        virtual void new_test( void ) { std::cout << "Call function cd.test();" << std::endl; }
        virtual void new_fun( void ) { std::cout << "Call function cd.fun();" << std::endl; }
};
 
class CC : public CA {
    public:
        void test( void ) { std::cout << "Call function cc.test();" << std::endl; }
        void fun( void ) { std::cout << "Call function cc.fun();" << std::endl; }
};
 
class CD : public CB, public CC {
    public:
        typedef CB BaseClass;
        void new_test( void ) { BaseClass::new_test(); }
        void new_fun( void ) { BaseClass::new_fun();}
};
 
int main () {
    std::cout << "Program:" << std::endl;
    CD cd;
    cd.test(); cd.fun(); cd.new_test(); cd.new_fun();
 
    while(true);
 
    return 0;
}
Что то не работает это если, ругается на:
error C2259: 'CD' : cannot instantiate abstract class due to following members: 'void CA::test(void)' : is abstract
0
153 / 137 / 34
Регистрация: 23.05.2009
Сообщений: 275
12.09.2012, 16:20 8
C++
1
2
3
4
5
class CB abstract : public CA {
    public:
        virtual void new_test( void ) { std::cout << "Call function cd.test();" << std::endl; }
        virtual void new_fun( void ) { std::cout << "Call function cd.fun();" << std::endl; }
};
нет определения полностью виртуальных функций унаследованных от CA. Зачем CB вообще наследует от СA?
0
В астрале
Эксперт С++
8036 / 4793 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.09.2012, 16:22 9
AndreaZzZ, Дык с умом же надо делать.

C++
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
#include <iostream>
 
class CA {
    public:
        virtual void test( void ) = 0;
        virtual void fun( void ) = 0;
};
 
class CB : virtual public CA {
    public:
        virtual void new_test( void ) { std::cout << "Call function cd.test();" << std::endl; }
        virtual void new_fun( void ) { std::cout << "Call function cd.fun();" << std::endl; }
};
 
class CC : virtual public CA {
    public:
        void test( void ) { std::cout << "Call function cc.test();" << std::endl; }
        void fun( void ) { std::cout << "Call function cc.fun();" << std::endl; }
};
 
class CD : public CB, public CC {
    public:
        typedef CB BaseClass;
        void new_test( void ) { BaseClass::new_test(); }
        void new_fun( void ) { BaseClass::new_fun();}
};
 
int main () {
    std::cout << "Program:" << std::endl;
    CD cd;
    cd.test(); cd.fun(); cd.new_test(); cd.new_fun();
 
    while(true);
 
    return 0;
}
http://liveworkspace.org/code/... f35dd363d1
0
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
12.09.2012, 16:38  [ТС] 10
Цитата Сообщение от Andsteadur Посмотреть сообщение
Зачем CB вообще наследует от СA?
CB это 'адвансед' версия CA
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.09.2012, 16:38

Абстрактные классы
Есть 3 абстракции, линия(бесконечная), луч(бесконечен в одну сторону) и отрезок (ограничен)....

абстрактные классы
компилятор ругается когда я пытаюсь записать объект класса!!!! подскажите что я не правильно...

абстрактные классы
Здрасте я при написании программы столкнулся с проблемой что немогу создать указатель на объект...

Абстрактные классы
Народ, вопрос есть такой. Есть абстрактный класс class A { protected: int a; public: A(int...

Абстрактные классы
Помогите пожалуйста с программой. Создать абстрактный класс Body. На его основе реализовать классы...

Абстрактные классы
void _tmain() { const int lim = 100; MyFunction *pFunc ; int count = 0; pFunc = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru