С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
AndreaZzZ
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
#1

Абстрактные классы - C++

11.09.2012, 22:15. Просмотров 530. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2012, 22:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Абстрактные классы (C++):

абстрактные классы - C++
компилятор ругается когда я пытаюсь записать объект класса!!!! подскажите что я не правильно делаю!! #include &lt;cstdlib&gt; #include...

Абстрактные классы - C++
Помогите плиз, экзаменационное задание, а разобраться не могу с ним: Создать консольное приложение, в котором реализовать работу...

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

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

Абстрактные классы - C++
Объясните пожалуйста почему это не работает и как исправить? cannot declare variable 'b1' to be of abstract type 'classB' because the...

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

9
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2012, 22:18 #2
Цитата Сообщение от AndreaZzZ Посмотреть сообщение
Как сделать так чтобы CD наследовал CB поверх которого должен быть CC?
"Поверх которого" означает наследование CC от CB?
0
AndreaZzZ
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
11.09.2012, 22:21  [ТС] #3
Да, но нельзя изменять CC.
0
PSIAlt
87 / 87 / 8
Регистрация: 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
AndreaZzZ
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
11.09.2012, 22:27  [ТС] #5
Как ни странно такая наследственность необходима. Представь что CA и CB это API какой-нибудь библиотеки, а CC и CD вносят нужные мне изменения в их бейсклассы.
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
11.09.2012, 22:28 #6
Представил. Только зачем связывать CC и CD ?
0
AndreaZzZ
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
Andsteadur
153 / 137 / 3
Регистрация: 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
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
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/b35cd1450fc4222923260ff35dd363d1
0
AndreaZzZ
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
12.09.2012, 16:38  [ТС] #10
Цитата Сообщение от Andsteadur Посмотреть сообщение
Зачем CB вообще наследует от СA?
CB это 'адвансед' версия CA
0
12.09.2012, 16:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2012, 16:38
Привет! Вот еще темы с ответами:

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

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

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

Наследование и абстрактные классы - C++
расскажите что это и с чем это едят......... а то как то встал на этом!!!


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.