С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52

Интерфейсы и наследования

18.05.2013, 20:33. Показов 2544. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть вот такая структура
C++
1
2
3
4
5
6
7
8
9
10
class Base
{
public:
virtual  void SomeBaseFun()=0;
}
class Object1: public Base
{
public:
virtual void SomeObject1Fun()=0;
}
это сам интерфейс , дальше идет реализация интерфейса
C++
1
2
3
4
5
6
7
8
9
10
class _Base: public Base
{
public:
void SomeBaseFun() {return 1;}
}
class _Object1: public Object1, public _Base
{
public:
void SomeObject1Fun()  {return 2;}
}
так вот
C++
1
Object1 *a=new _Object1;
ошибка так как _Object1 абстрактный метод SomeBaseFun()=0;
Вот теперь сама задача , класс Object1 который абстрактный ничего не должен знать о не абстрактных классах
то есть его нельзя наследовать от _Base, более того класс Base и _Base всегда один а вот классов Object десятки Object1 Object2 Object3- ObjectN , тесть писать class _Base: public Base, public Object1 нельзя , как заставить работать
C++
1
Object1 *a=new _Object1;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.05.2013, 20:33
Ответы с готовыми решениями:

Чем отличаются структуры для наследования интерфейса от структур для наследования реализаций?
Дорогие программисты, во первых, хочу поздравить вас с Наступающим новым Годом! Я к вам обращаюсь с маленькой просьбой. Я никак не могу...

наследования
Приведите пожалуйста пару примеров наследования.

Наследования
Что именно наследует класс-потомок при наследовании? А что не наследует? Чем отличаются private, public и protected наследование?

28
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
18.05.2013, 20:50
попробуйте так:
C++
1
2
3
4
5
6
7
8
9
class Object1: virtual public Base//Виртуальное наследование
{
//...
};
 
class _Base: virtual public Base
{
//...
};
0
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 20:55  [ТС]
Вот как раз так пробовал , дальше в _Object1 так же , вес ок , но создавая _Object2, _Object3 так же , начинаются непонятные глюки , при обращение объектов к глобальной переменной выдается чушь!
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
18.05.2013, 20:56
может покажите код?
Или нам гадать что там у Вас и как.
0
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:13  [ТС]
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*Main.h*/
сlass GObject  
{
public:
virtual ~GObject() {};
virtual int GetIntError()   =0;  //получить код ошибки
virtual char* GetTextError() =0;  //получить текст ошибки
 
};
 
 
 
class Object1: virtual public GObject  
{
//...
};
 
 
class Object2: virtual public GObject  
{
//...
};
 
 
/*MainHead.h*/
 
#ifndef _MAIN_HEAD_
#define _MAIN_HEAD_
#include "map.h"
#include "Main.h"
map <int, AnsiString>  ErrorsMap; //значения инициализируеться при первом запуске
 
//#include ...
#endif
 
 
 
/*GObject.h*/
 
#include "MainHead.h"
class _GObject:public virtual GObject
{
public:
_GObject(){MainError=0;};
~_GObject() {};
int GetIntError()   {return MainError;};  //получить код ошибки
char* GetTextError() {return ErrorsMap[MainError].c_str();};  //получить текст ошибки
void SetError(int Err){MainError=Err;};
private:
int MainError;
};
 
 
/*GObject1.h*/
#include "MainHead.h"
class _Object1: public _GObject ,public  Object1 
{
public:
_Object1():
 GObject(),Object1(),_GObject(){};
//...
};
теперь
C++
1
2
3
Object1 * a=new _Object1;
a-> SetError(1);
ShowMessage(a->GetTextError());
А вот теперь так же наследуем Object2 и бах GetTextError() всегда возращает пустое значение и для обхекта 1 и 2
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
18.05.2013, 21:24
У Object1 вообще нет метода SetError
0
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:31  [ТС]
Ну да не так написал, извините что ввел в заблуждение
C++
1
2
3
4
5
6
7
class _Object1: public _GObject ,public  Object1 
{
public:
_Object1():
 GObject(),Object1(),_GObject(){};
void SomeFunction() {SetError(0) ;/*some metods*/; SetError(1);}
};
ну примерно так а GetError, как раз извне идет
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
18.05.2013, 21:32
Да напутано шо попало.

Croessmah, Нет есть они становятся чисто виртуальными как их базовый класс. (из базы перенеслись)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
18.05.2013, 21:34
Цитата Сообщение от ninja2 Посмотреть сообщение
Croessmah, Нет есть они становятся чисто виртуальными как их базовый класс. (из базы перенеслись)
Ткните пальцем где есть SetError?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
сlass GObject  
{
public:
virtual ~GObject() {};
virtual int GetIntError()   =0;  //получить код ошибки
virtual char* GetTextError() =0;  //получить текст ошибки
 
};
 
 
 
class Object1: virtual public GObject  
{
//...
};
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
18.05.2013, 21:35
Andreyasu, Там у тебя не разберешь. Я щас тебе примерчик скину как через указатель на базовый класс вызвать виртуально функцию, от по нему и свой пример делай.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
18.05.2013, 21:37
Цитата Сообщение от Andreyasu Посмотреть сообщение
ну примерно так а GetError, как раз извне идет
C++
1
2
3
Object1 * a=new _Object1;
a-> SetError(1);
ShowMessage(a->GetTextError());
В _Object1 SetError есть, а в Object1 - нет
0
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:38  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "MainHead.h"
class _GObject:public virtual GObject
{
public:
_GObject(){MainError=0;};
~_GObject() {};
int GetIntError()   {return MainError;};  //получить код ошибки
char* GetTextError() {return ErrorsMap[MainError].c_str();};  //получить текст ошибки
void SetError(int Err){MainError=Err;}; //ВОТ ОН СЭТ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
private:
int MainError;
};
_Object1 идет от _GObject а не GObject ,следовательно наследует этот метод в себя , инкапсулируя его от интерфейса
То есть внутри реализации _Object1 мы можем выставлять ошибки а из вне нет
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
18.05.2013, 21:39
Croessmah, Ну да да да ошибся.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
18.05.2013, 21:41
Цитата Сообщение от Andreyasu Посмотреть сообщение
_Object1 идет от _GObject а не GObject
От него идет, но у Вас указатель на Object1, а не на _Object1
C++
1
Object1 * a=new _Object1;
А для объектов Object1 метода SetError не существует
0
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:44  [ТС]
Это точно работает я проверял.
Я выставляю ошибку не по указателю , там нельзя вы правы , а ТОЛЬКО при описание методов самого класса _Object1
то есть
C++
1
2
3
4
5
void _Object1::SomeFunction() {
SetError(0) ;
/*some metods*/;
 SetError(1);
}
Внутри самого класса _Object1 он сам взывает свой же унаследованный метод, а потом


C++
1
2
3
Object1 * a=new _Object1;
a->SomeFunction(); //которая прописаннна в интерфейсе
ShowMessage(a->GetTextError());
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
18.05.2013, 21:49
Andreyasu, Ну да да да или попробуй добавить в базовый класс чисто виртуальный метод SetError(), что бы он перенесся в Object1
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
18.05.2013, 21:49
C++
1
2
Object1 * a=new _Object1;
a->SomeFunction(); //которая прописаннна в интерфейсе
Либо Вы приводите не валидный код, либо что-то забыли. Object1 наследуется от GObject
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
сlass GObject  
{
public:
virtual ~GObject() {};
virtual int GetIntError()   =0;  //получить код ошибки
virtual char* GetTextError() =0;  //получить текст ошибки
 
};
 
 
 
class Object1: virtual public GObject  
{
//...
};
SomeFunction() у него тоже нет.
0
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:51  [ТС]
Цитата Сообщение от ninja2 Посмотреть сообщение
ndreyasu, Ну да да да или попробуй добавить в базовый класс чисто виртуальный метод SetError(), что бы он перенесся в Object1
Ну это как раз не надо по логике программы , никто из вне не должен выставлять ошибки , это именно ошибки выполнения
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
18.05.2013, 21:53
В гомнокодец добавь в класс
GObject метод virtual void SetError()=0;
и все должно заработать
0
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:55  [ТС]
SomeFunction() Допустим добавили в Object1 и _Object1, я просто не стал заново писать , а я говорю не про абстрактный класс Object1 а про внутреннею реализацию _Object1 (с черточкой) унаследованную нет от GObject а от _GObject (с черточкой)

Добавлено через 1 минуту
Цитата Сообщение от ninja2 Посмотреть сообщение
В гомнокодец добавь в класс
GObject метод virtual void SetError()=0;
и все должно заработать
А если писать по уму то как тогда спроектировать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2013, 21:55
Помогаю со студенческими работами здесь

Наследования
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class student { protected: int sem; string name; float...

интерфейсы в с ++
как то раз нашел в на просторах интернета инфу в которой говорилось что можно работать с интерфейсами в с++ без СОМ , в пример тому...

Интерфейсы
Вот не могу понять , берем вот такую структуру class Ab //интерфейс { public: virtual void GetNum()=0; }; class...

Виды наследования С++
Построить класс статистическая выборка числовых величин со свойствами: количество элементов выборки, массив элементов выборки и методами:...

Классы наследования
Необходима чтобы personcart содержал массив карточек персон (класс cart) как не крутил вечная ошибка fatal error LNK1120: 1 unresolved...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru