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

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

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

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

18.05.2013, 20:33. Просмотров 903. Ответов 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
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:49 #16
Andreyasu, Ну да да да или попробуй добавить в базовый класс чисто виртуальный метод SetError(), что бы он перенесся в Object1
0
Croessmah
Эксперт CЭксперт С++
13506 / 7664 / 866
Регистрация: 27.09.2012
Сообщений: 18,850
Записей в блоге: 3
Завершенные тесты: 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
231 / 187 / 7
Регистрация: 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
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 21:57 #21
Andreyasu, А как из вне ты выставишь через виртуальный класс? Просто переопредели этот метод для нужных классво и все, либо поставь просто виртуальную функцию пустую, чтобы вызывать можно было и все.
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 21:58  [ТС] #22
Цитата Сообщение от ninja2 Посмотреть сообщение
Andreyasu, А как из вне ты выставишь через виртуальный класс? Просто переопредели этот метод для нужных классво и все, либо поставь просто виртуальную функцию пустую, чтобы вызывать можно было и все.

Добавлено через 1 минуту
Andreyasu, В одном классе пытайся все делать. Я так делаю в основном делаю и норм.
Классов object могут быть десятки и у них одна большая база (набор методов) , глупо их писать каждый раз .
Код работает SetError выставляет более того GetIntError() работает правильно! Но вот именно GetTextError() возращает путсоту
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 22:03 #23
Andreyasu, Я сам в проектировании не силен. Просто лишних классов не создавать.

Наверно Object1 и Ojject2 это лишние классы.

Цитата Сообщение от Andreyasu Посмотреть сообщение
Классов object могут быть десятки и у них одна большая база (набор методов) , глупо их писать каждый раз .
Код работает SetError выставляет более того GetIntError() работает правильно! Но вот именно GetTextError() возращает путсоту
Нет ну возможно ты и правильно спроектировал, тут как говорится: "кто как хочет так и дрочит". Ну читать сходу код не сильно легко. Пойдет лишь бы работал правильно и тебе понятно было.
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 22:05  [ТС] #24
Цитата Сообщение от ninja2 Посмотреть сообщение
Andreyasu, Я сам в проектировании не силен. Просто лишних классов не создавать.

Наверно Object1 и Ojject2 это лишние классы.
У тя есть библиотека Животные , ты предлогаешь одни классом описать котов собак и верблюдов?
И при то что все одинаково ходят по большому ,или писают тоже одинаково (ну допустим) для каждого из сотни животных отдельно прописовать метод void пописать() или лучше вынести это в базис?
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 22:09 #25
Andreyasu, Нут тут нужно наследование применять, выделить общий класс Животные, в нем собрать общие свойства и методы, а от него наследовать остальных животных.

Andreyasu, Просто мелкие проги бывают там на 500 строк или там на 1к. смысла нету разбивать, ну и дело вкуса наверно, а может и опытности.
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 22:11  [ТС] #26
Цитата Сообщение от ninja2 Посмотреть сообщение
Andreyasu, Нут тут нужно наследование применять, выделить общий класс Животные, в нем собрать общие свойства и методы, а от него наследовать остальных животных.

Andreyasu, Просто мелкие проги бывают там на 500 строк или там на 1к. смысла нету разбивать, ну и дело вкуса наверно, а может и опытности.
Вот GObject и есть тот самый класс Животные
Тут почти 15000 строк, без четкого структурирования все бы было провалено)
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 22:13 #27
Да у тебя еще Object1 и Object2 чисто виртуальные классы пустые, толку то от них?

Цитата Сообщение от Andreyasu Посмотреть сообщение
Тут почти 15000 строк
Да это дофигища, я таких исходников и не видел.
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
18.05.2013, 22:15  [ТС] #28
Цитата Сообщение от ninja2 Посмотреть сообщение
Да у тебя еще Object1 и Object2 чисто виртуальные классы пустые, толку то от них?
Это внешний H файл поставляемый вместе с DLL а реализация внутри , это концепция проектирования DLL есть такая , когда на конченому программисту даются только интерфейсы работы с классами а не сами классы
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.05.2013, 22:19 #29
Andreyasu, Ну примерно ясно. Там можно все что угодно дальше добавить от них, если это громадная программа. Object3 например может быть применимо двойное наследование и от него другой какой нить класс будет идти, и вызов будет уже совсем других методов. Можно все что угодно придумать.
0
18.05.2013, 22:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2013, 22:19
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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