Форум программистов, компьютерный форум CyberForum.ru

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

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

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

11.09.2012, 22:15. Просмотров 511. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2012, 22:15     Абстрактные классы
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2012, 22:18     Абстрактные классы #2
Цитата Сообщение от AndreaZzZ Посмотреть сообщение
Как сделать так чтобы CD наследовал CB поверх которого должен быть CC?
"Поверх которого" означает наследование CC от CB?
AndreaZzZ
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
11.09.2012, 22:21  [ТС]     Абстрактные классы #3
Да, но нельзя изменять CC.
PSIAlt
86 / 86 / 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;
};
Пока у тебя вроде спорных моментов нет, но думаю что будет. А вообще не вижу ни намека на необходимость такого наследования.
з.ы. Хотя, если абстракты выступают исключительно как интерфейсы, то можно пока не париться
AndreaZzZ
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
11.09.2012, 22:27  [ТС]     Абстрактные классы #5
Как ни странно такая наследственность необходима. Представь что CA и CB это API какой-нибудь библиотеки, а CC и CD вносят нужные мне изменения в их бейсклассы.
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
11.09.2012, 22:28     Абстрактные классы #6
Представил. Только зачем связывать CC и CD ?
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
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?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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/b35cd1...260ff35dd363d1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2012, 16:38     Абстрактные классы
Еще ссылки по теме:

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

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

Абстрактные и производные классы С++ - C++
Проблема: Есть базовый класс &quot;Фигура&quot;, и производные: &quot;Точка&quot;, &quot;Круг&quot;, &quot;Прямоугольник&quot;, &quot;Треугольник&quot;. Надо сделать чистую виртуальную...

Абстрактные и производные классы - C++
Создать класс - данные - абстрактный базовый класс. Создать производные классы - данные типа сигнал, данные типа результат обработки и...

Абстрактные классы. Наследование - C++
Здравствуйте! Препод дал задание на наследование и абстрактные классы. Кому не трудно, посмотрите, пожалуйста код, правильно ли я делаю? ...


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

Или воспользуйтесь поиском по форуму:
AndreaZzZ
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
12.09.2012, 16:38  [ТС]     Абстрактные классы #10
Цитата Сообщение от Andsteadur Посмотреть сообщение
Зачем CB вообще наследует от СA?
CB это 'адвансед' версия CA
Yandex
Объявления
12.09.2012, 16:38     Абстрактные классы
Ответ Создать тему
Опции темы

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