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

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

Восстановить пароль Регистрация
 
 
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 20:33     Интерфейсы и наследования #1
Есть вот такая структура
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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2013, 20:33     Интерфейсы и наследования
Посмотрите здесь:

C++ наследования
C++ Свойства наследования
Наследования C++
C++ интерфейсы в с ++
Интерфейсы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 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
{
//...
};
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 20:55  [ТС]     Интерфейсы и наследования #3
Вот как раз так пробовал , дальше в _Object1 так же , вес ок , но создавая _Object2, _Object3 так же , начинаются непонятные глюки , при обращение объектов к глобальной переменной выдается чушь!
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
18.05.2013, 20:56     Интерфейсы и наследования #4
может покажите код?
Или нам гадать что там у Вас и как.
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
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
18.05.2013, 21:24     Интерфейсы и наследования #6
У Object1 вообще нет метода SetError
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, как раз извне идет
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:32     Интерфейсы и наследования #8
Да напутано шо попало.

Croessmah, Нет есть они становятся чисто виртуальными как их базовый класс. (из базы перенеслись)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 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  
{
//...
};
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:35     Интерфейсы и наследования #10
Andreyasu, Там у тебя не разберешь. Я щас тебе примерчик скину как через указатель на базовый класс вызвать виртуально функцию, от по нему и свой пример делай.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 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 - нет
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 мы можем выставлять ошибки а из вне нет
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:39     Интерфейсы и наследования #13
Croessmah, Ну да да да ошибся.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
18.05.2013, 21:41     Интерфейсы и наследования #14
Цитата Сообщение от Andreyasu Посмотреть сообщение
_Object1 идет от _GObject а не GObject
От него идет, но у Вас указатель на Object1, а не на _Object1
C++
1
Object1 * a=new _Object1;
А для объектов Object1 метода SetError не существует
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());
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:49     Интерфейсы и наследования #16
Andreyasu, Ну да да да или попробуй добавить в базовый класс чисто виртуальный метод SetError(), что бы он перенесся в Object1
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 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() у него тоже нет.
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:51  [ТС]     Интерфейсы и наследования #18
Цитата Сообщение от ninja2 Посмотреть сообщение
ndreyasu, Ну да да да или попробуй добавить в базовый класс чисто виртуальный метод SetError(), что бы он перенесся в Object1
Ну это как раз не надо по логике программы , никто из вне не должен выставлять ошибки , это именно ошибки выполнения
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:53     Интерфейсы и наследования #19
В гомнокодец добавь в класс
GObject метод virtual void SetError()=0;
и все должно заработать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2013, 21:55     Интерфейсы и наследования
Еще ссылки по теме:

C++ Организация наследования
C++ Наследования
чем отличаются структуры для наследования интерфейса, от структур, для наследования реализаций C++

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

Или воспользуйтесь поиском по форуму:
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;
и все должно заработать
А если писать по уму то как тогда спроектировать?
Yandex
Объявления
18.05.2013, 21:55     Интерфейсы и наследования
Ответ Создать тему
Опции темы

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