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

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

Восстановить пароль Регистрация
 
AndreaZzZ
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 6
11.09.2012, 22:15     Абстрактные классы #1
В общем есть у нас 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 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
 Аватар для 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
 Аватар для 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
152 / 136 / 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
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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++ Абстрактные классы
C++ Абстрактные классы
абстрактные классы C++
Абстрактные классы 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     Абстрактные классы
Ответ Создать тему
Опции темы

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