Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
#1

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

18.05.2013, 20:33. Просмотров 930. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Интерфейсы и наследования (C++):

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

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

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

Наследования - C++
#include <iostream> #include <string> using namespace std; class student { protected: int sem; string name; float...

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

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

28
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:32 #8
Да напутано шо попало.

Croessmah, Нет есть они становятся чисто виртуальными как их базовый класс. (из базы перенеслись)
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:35 #10
Andreyasu, Там у тебя не разберешь. Я щас тебе примерчик скину как через указатель на базовый класс вызвать виртуально функцию, от по нему и свой пример делай.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:39 #13
Croessmah, Ну да да да ошибся.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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
18.05.2013, 21:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2013, 21:44
Привет! Вот еще темы с ответами:

Организация наследования - C++
Здраствуйте! У меня есть несколько классов: class Base { public: int baseGet() { return i; } void...

Реализация наследования - C++
Здравствуйте, при решении лабораторной возникла такая проблема: при создании объекта производного класса в конструкторе базового...

механизм наследования - C++
Есть такой код: #include &lt;iostream&gt; using namespace std; class base { protected: int i, j; // private to base, but...

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


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

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

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