Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
1

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

18.05.2013, 20:33. Просмотров 986. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2013, 20:33
Ответы с готовыми решениями:

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

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

Наследования
Что именно наследует класс-потомок при наследовании? А что не наследует? Чем...

Наследования
#include <iostream> #include <string> using namespace std; class student...

Интерфейсы
Вот не могу понять , берем вот такую структуру class Ab //интерфейс {...

28
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
18.05.2013, 20:50 2
попробуйте так:
C++
1
2
3
4
5
6
7
8
9
class Object1: virtual public Base//Виртуальное наследование
{
//...
};
 
class _Base: virtual public Base
{
//...
};
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 20:55  [ТС] 3
Вот как раз так пробовал , дальше в _Object1 так же , вес ок , но создавая _Object2, _Object3 так же , начинаются непонятные глюки , при обращение объектов к глобальной переменной выдается чушь!
0
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
18.05.2013, 20:56 4
может покажите код?
Или нам гадать что там у Вас и как.
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:13  [ТС] 5
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
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
18.05.2013, 21:24 6
У Object1 вообще нет метода SetError
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:31  [ТС] 7
Ну да не так написал, извините что ввел в заблуждение
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
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:32 8
Да напутано шо попало.

Croessmah, Нет есть они становятся чисто виртуальными как их базовый класс. (из базы перенеслись)
0
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
18.05.2013, 21:34 9
Цитата Сообщение от 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
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:35 10
Andreyasu, Там у тебя не разберешь. Я щас тебе примерчик скину как через указатель на базовый класс вызвать виртуально функцию, от по нему и свой пример делай.
0
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
18.05.2013, 21:37 11
Цитата Сообщение от Andreyasu Посмотреть сообщение
ну примерно так а GetError, как раз извне идет
C++
1
2
3
Object1 * a=new _Object1;
a-> SetError(1);
ShowMessage(a->GetTextError());
В _Object1 SetError есть, а в Object1 - нет
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:38  [ТС] 12
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
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:39 13
Croessmah, Ну да да да ошибся.
0
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
18.05.2013, 21:41 14
Цитата Сообщение от Andreyasu Посмотреть сообщение
_Object1 идет от _GObject а не GObject
От него идет, но у Вас указатель на Object1, а не на _Object1
C++
1
Object1 * a=new _Object1;
А для объектов Object1 метода SetError не существует
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:44  [ТС] 15
Это точно работает я проверял.
Я выставляю ошибку не по указателю , там нельзя вы правы , а ТОЛЬКО при описание методов самого класса _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
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:49 16
Andreyasu, Ну да да да или попробуй добавить в базовый класс чисто виртуальный метод SetError(), что бы он перенесся в Object1
0
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
18.05.2013, 21:49 17
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
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:51  [ТС] 18
Цитата Сообщение от ninja2 Посмотреть сообщение
ndreyasu, Ну да да да или попробуй добавить в базовый класс чисто виртуальный метод SetError(), что бы он перенесся в Object1
Ну это как раз не надо по логике программы , никто из вне не должен выставлять ошибки , это именно ошибки выполнения
0
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:53 19
В гомнокодец добавь в класс
GObject метод virtual void SetError()=0;
и все должно заработать
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:55  [ТС] 20
SomeFunction() Допустим добавили в Object1 и _Object1, я просто не стал заново писать , а я говорю не про абстрактный класс Object1 а про внутреннею реализацию _Object1 (с черточкой) унаследованную нет от GObject а от _GObject (с черточкой)

Добавлено через 1 минуту
Цитата Сообщение от ninja2 Посмотреть сообщение
В гомнокодец добавь в класс
GObject метод virtual void SetError()=0;
и все должно заработать
А если писать по уму то как тогда спроектировать?
0
18.05.2013, 21:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2013, 21:55

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

Свойства наследования
1) Объект класса-потомка может вызывать некоторые методы класса-предка. 2)...

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


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

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

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