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

Вопрос про наследование. - C++

Восстановить пароль Регистрация
 
MaxShell
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 19
11.12.2010, 23:13     Вопрос про наследование. #1
Добрый день всем!

Возможно ли создать производный класс в который будут помещены 2 объекта базового класса с возможностью переопределения методов последнего?

напрмер
class a {
int x;
public a(int y) {x=y;}
virtual int GetX() const {return x;}
}

class b : public a {
int x;
a obj1;
a obj2;
public b(int y): a(10), obj1(2),obj2(4)
{
}
virtual int GetX() const {return obj1.GetX()+obj2.GetX();}
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.12.2010, 23:22     Вопрос про наследование. #2
Что может быть проще, чем проверить?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.12.2010, 23:41     Вопрос про наследование. #3
как всегда - автора лень
MaxShell
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 19
12.12.2010, 00:20  [ТС]     Вопрос про наследование. #4
Честно говоря думал ваще не заработает.

#include "stdlib.h"
#include "iostream"
class a {
private:
int x;
public:
a(int y) {x=y;}
virtual int GetX() const {return x;}
};

class b : public a {
private:
int x;
a obj1;
a obj2;
public:
b(int y): a(y), obj1(y),obj2(y/2)
{

}
virtual int GetX() const {return obj1.GetX()+obj2.GetX();}
} ;

int main(){

b bo(10);

std::cout<<bo.GetX();

return 0;
}

Добавлено через 21 минуту
Вот ткао

Добавлено через 8 минут
Подскажите плиз.
Допустим, что "x" это динамический массив и вызываемый код получив ссылку на объект типа "а" мог читать с него данные. Задача поменялась и надо использовать тип "b" с тем же методом получения массива, который должен состоять уже из двух массивов. Как корректно это сделать чтобы памяти лишней не кушать и т.п? Куда копать хотябы?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
12.12.2010, 00:37     Вопрос про наследование. #5
Конструкторы копирования, деструкторы, операторы присваивания, оператор получения элемента массива [] ... Начинайте, подскажем.

И, пожалуйста, используйте осмысленные названия, а то через а, b, c, iiii1, ijij1 сложно пробиваться.
MaxShell
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 19
12.12.2010, 01:30  [ТС]     Вопрос про наследование. #6
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
#include "stdlib.h"
#include "iostream"
class TStorage {
private:
    int **buffers; 
public:
    TStorage(int numBuffers, int bufferSize) {
        buffers = new int*[numBuffers];
        for (int i = 0; i < numBuffers; ++i)
        {
            buffers[i] = new int(bufferSize);
        }
    }
    virtual int **GetBuffers() const {return buffers;}
};
 
class TCycleStorage : public TStorage {
private:
TStorage firstHalfStorage;
TStorage secondHalfStorage;
public:
    TCycleStorage(int numBuffers, int bufferSize)
        : TStorage(0,0),
        firstHalfStorage(numBuffers/2,bufferSize),
        secondHalfStorage(numBuffers/2,bufferSize)
{
 
}
virtual int **GetBuffers() const {return firstHalfStorage.GetBuffers();}
//Надо вернуть объединённый массив   функционально так {return firstHalfStorage.GetBuffers()+secondHalfStorage.GetBuffers();}
} ;
 
int main(){
 
    int numBuffers = 2;
    int bufferSize = 2;
    TCycleStorage mainStorage(numBuffers,bufferSize);
 
    int **currentBuffers  = mainStorage.GetBuffers();
 
    
    
    while(1){};
    return 0;
}
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
12.12.2010, 01:39     Вопрос про наследование. #7
Обычная практика - явно привести возвращаемые указатели к void*, а при использовании возвращенного результата в последствии - обратно к нужному типу.
MaxShell
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 19
12.12.2010, 01:55  [ТС]     Вопрос про наследование. #8
а можно на примере пояснить?
MaxShell
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 19
12.12.2010, 12:45  [ТС]     Вопрос про наследование. #9
Добавлено через 1 минуту
Я просто не могу понять как мне оъеденить массивы от двух объектов и отдать их в вызываемый код? единственно что приходит на ум это создавать третий запихивать в него текущие значения первых при вызове метода и отдавать ссылку на созданный массив. но это не айс
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
12.12.2010, 13:39     Вопрос про наследование. #10
Идеологически, отдавая указатели на элементы данных класса, вы нарушаете инкапсуляцию. Более грамотно было бы организовать во втором классе методы доступа к внутренним данным массива. Например, через operator[] и рекомендованный метод at().

Добавлено через 3 минуты
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
class TCycleStorage : public TStorage {
private:
TStorage firstHalfStorage;
TStorage secondHalfStorage;
public:
        TCycleStorage(int numBuffers, int bufferSize)
                : TStorage(0,0),
                firstHalfStorage(numBuffers/2,bufferSize),
                secondHalfStorage(numBuffers/2,bufferSize)
         {}
         int& operator[](int n)
         {
             if (n<firstHalfStorage.size())
                      return firstHalfStorage[n];
             else
                      return secondHalfStorage[n-firstHalfStorage.size()];
         }
} ;
 
...
...
TCycleStorage C;
int i=5;
C[i] = i;
...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2010, 14:40     Вопрос про наследование.
Еще ссылки по теме:

C++ Объясните про наследование
C++ Глупый вопрос про наследование
[C++] Вопрос про ввод C++

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

Или воспользуйтесь поиском по форуму:
MaxShell
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 19
12.12.2010, 14:40  [ТС]     Вопрос про наследование. #11
lemegeton, спасибо! Буду в эту сторону смотреть.
Yandex
Объявления
12.12.2010, 14:40     Вопрос про наследование.
Ответ Создать тему
Опции темы

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