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

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

Войти
Регистрация
Восстановить пароль
 
MaxShell
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 19
#1

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

11.12.2010, 23:13. Просмотров 707. Ответов 10
Метки нет (Все метки)

Добрый день всем!

Возможно ли создать производный класс в который будут помещены 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();}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2010, 23:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос про наследование. (C++):

Небольшой вопрос про наследование. - C++
Как понять Circle (int x, int y, int r, TColor p, TColor b) : cx (x), cy (y), rad (r), Shape (p, b) {} строчку понял что это...

Глупый вопрос про наследование - C++
Вот фрагмент кода, реального: class CListviewParamPrimary : public CListviewParamFloats { private: /** * @brief Возвращает...

Вопрос про "Наследование" и "Объединение" - C++
Доброго времени суток. Изучаю ООП, пока что не удачно. Появилось пару вопросиков. первый вид Animals // Млекопитающие class...

Про наследование от exception - C++
Есть пример наследования класса для создания собственных исключений: class MyException: public std::exception { virtual const char*...

Про ромбовидное наследование - C++
Доброе время форумчане! Имеем 3 класс! class A { }; class b { }; class c {

Объясните про наследование - C++
class A { protected: int n; // закрыты для A, но доступны для B public: virtual void func(void) = 0; }; class B: public...

10
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
11.12.2010, 23:22 #2
Что может быть проще, чем проверить?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
11.12.2010, 23:41 #3
как всегда - автора лень
0
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" с тем же методом получения массива, который должен состоять уже из двух массивов. Как корректно это сделать чтобы памяти лишней не кушать и т.п? Куда копать хотябы?
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
12.12.2010, 00:37 #5
Конструкторы копирования, деструкторы, операторы присваивания, оператор получения элемента массива [] ... Начинайте, подскажем.

И, пожалуйста, используйте осмысленные названия, а то через а, b, c, iiii1, ijij1 сложно пробиваться.
0
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;
}
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
12.12.2010, 01:39 #7
Обычная практика - явно привести возвращаемые указатели к void*, а при использовании возвращенного результата в последствии - обратно к нужному типу.
0
MaxShell
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 19
12.12.2010, 01:55  [ТС] #8
а можно на примере пояснить?
0
MaxShell
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 19
12.12.2010, 12:45  [ТС] #9
Добавлено через 1 минуту
Я просто не могу понять как мне оъеденить массивы от двух объектов и отдать их в вызываемый код? единственно что приходит на ум это создавать третий запихивать в него текущие значения первых при вызове метода и отдавать ссылку на созданный массив. но это не айс
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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;
...
0
MaxShell
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 19
12.12.2010, 14:40  [ТС] #11
lemegeton, спасибо! Буду в эту сторону смотреть.
0
12.12.2010, 14:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2010, 14:40
Привет! Вот еще темы с ответами:

подскажите как првильно написать программу про наследование классов - C++
подскажите как првильно написать задачу про наследование классов вот надо написать задачу про кошку чтобы 1 пророда-сиамская ...

Вопрос про char - C++
Пожалуйста обьясните доступным языком в чем разница между объявлениями, и какие когда лучше использовать char a; char *c; char b=new...

Вопрос про mkdir - C++
У меня уже есть идея реализации но мне кажется есть способ проще! И так к делу вот часть кода точнее строчка WinExec(&quot;cmd /c mkdir...

Вопрос про табуляцию в C++ - C++
Символ табуляции он одновременно переносит курсор на след.строку и выравнивает строки?


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

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

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