С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для gordeyb
4 / 2 / 2
Регистрация: 26.03.2018
Сообщений: 78

Единый базовый класс для всех производных

22.02.2020, 20:26. Показов 665. Ответов 6
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! У меня есть два класса - базовый (Base) и производный (Child). В начале я создаю объект класса Base - b и вывожу его адрес (в конструкторе). Затем создаю 2 объекта - c1 и с2, которые являются производными. Мне нужно сделать так, чтобы c1 и c2 наследовались конкретно от объекта b, чтобы все наследуемые поля и методы имели одинаковые адреса как в базовом, так и во всех производных классах.
Код:
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
#include <iostream>
using namespace std;
 
class Base{
public:
    Base(){
        cout << "Base() " << this << endl;
    }
    ~Base()
    {
        cout << "~Base() " << this << endl;
    }
};
 
class Child : public Base {
public:
    Child(){}
    ~Child(){}    
};
 
int main(){
    cout << "Base init: ";
    Base b;
    Child c1, c2;
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.02.2020, 20:26
Ответы с готовыми решениями:

Создать 1 базовый класс и несколько производных
Создать 1 базовый класс и несколько производных. Все небольшие ф-ии сделать встроенными (особенно конструк- торы). В производных классах...

Программа содержащая базовый класс и несколько производных
Уважаемые программисты объясните пожалуйста как мне составить программу. которая должна выглядеть вот так то есть нам дали задание и...

Создать базовый класс Автомобили и два производных от него
Решить на C#. Cроки сдачи задания горят, хелп плиз!) Есть класс: Автомобили В классе есть свойство - цвет. Есть метод начать...

6
Модератор
Эксперт С++
 Аватар для zss
13770 / 10963 / 6491
Регистрация: 18.12.2011
Сообщений: 29,240
22.02.2020, 20:52
Нельзя чтобы несколько ЭКЗЕМПЛЯРОВ имели одинаковые адреса.
Скорее всего, Вы хотите от классов полиморфизма (использование указателя на базовый класс для работы с объектами производного класса):
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
class Base{
public:
    Base(){ cout << "Base() " << this << endl;
    }
    ~Base()
    {
        cout << "~Base() " << this << endl;
    }
    virtual void Print()=0;
};
 
class Child : public Base {
    int n;
public:
    Child(int N){ n=N;}
    ~Child(){}    
    void Print(){ cout<<"Child "<<n<<endl; }
};
 
int main(){
    //cout << "Base init: ";
    Base* pb;
    Child c1(1), c2(2);
    pb=&c1;
    pb->Print();  // Child 1
    pb=&c2;
    pb->Print();   // Child 2
    return 0;
}
0
 Аватар для gordeyb
4 / 2 / 2
Регистрация: 26.03.2018
Сообщений: 78
22.02.2020, 21:15  [ТС]
Не совсем. Мне просто нужно, чтобы у всех производных классов наследуемые методы имели одинаковые значения. Я думаю, что такого эффекта можно добиться, сделав все поля в базовом классе статичными, но хотелось бы избежать этого.
0
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
22.02.2020, 22:00
Можно вот так извратиться, избежав статичных полей.

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
#include <iostream>
using namespace std;
 
class Base {
public:
    Base() {
        cout << "Base() " << this << endl;
 
        struct ConstrStruct
        {
            int somePropertyInit;
 
            ConstrStruct()
            {
                somePropertyInit = 10;  // Здесь производим какую-либо инициализацию (нпример, загрузку данных из файла)
            }           
        };
        static ConstrStruct constrStruct;
        someProperty = constrStruct.somePropertyInit;
 
    }
    ~Base()
    {
        cout << "~Base() " << this << endl;
    }
 
private:
    int someProperty;
};
 
class Child : public Base {
public:
    Child() {}
    ~Child() {}
};
 
int main() {
    cout << "Base init: ";
    Base b;
    Child c1, c2;   
 
    return 0;
}
0
2622 / 1633 / 266
Регистрация: 19.02.2010
Сообщений: 4,338
22.02.2020, 22:18
Цитата Сообщение от gordeyb Посмотреть сообщение
Мне нужно сделать так, чтобы c1 и c2 наследовались конкретно от объекта b
От объекта, т.е. от ЭКЗЕМПЛЯРА класса?
Тогда надо объявить "конструктор копий"
C++
1
Child(Base &b) { ... }
и в нём копировать значения всех (либо только нужных) полей от переданного эталонного объекта.
И создавать объектов Child надо будет соответственно с указанием эталонного объекта (второй объект потомка для примера создал тут динамически, а третий породил от экземпляра Child'a):
C++
1
2
Base b;
Child c1(b), *c2=new Child(b), c3(c1);
Если у базового класса сделать такой же конструктор - часть действий (по копированию значений тех полей, которые присутствуют именно в базовом классе) можно делегировать туда:
C++
1
2
3
4
Base(Base &b) { ... }
Child(Base &b) :
    Base(b) //вызываем параметризованный конструктор предка вместо дефолтного void-конструктора
{ /*а тут делаем только относящиеся к Child вещи, поскольку предок уже сделал то, в чём он сам компетентен*/ }
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.02.2020, 23:28
Цитата Сообщение от gordeyb Посмотреть сообщение
Мне просто нужно, чтобы у всех производных классов наследуемые методы имели одинаковые значения. Я думаю, что такого эффекта можно добиться, сделав все поля в базовом классе статичными, но хотелось бы избежать этого.
методы - это по другому "функции-члены".
ты с "данными-членами" не попутал?

если ты имел ввиду данные-члены,
тогда static в базовом классе - то, что доктор прописал.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.02.2020, 01:35
Цитата Сообщение от gordeyb Посмотреть сообщение
Мне нужно сделать так, чтобы c1 и c2 наследовались конкретно от объекта b, чтобы все наследуемые поля и методы имели одинаковые адреса как в базовом, так и во всех производных классах.
Адреса нестатических данных и в одном классе разнятся для разных его объектов. Нужно точно уяснить разницу между классами (типами) и объектами до изучения наследования.

Добавлено через 4 минуты
Цитата Сообщение от gordeyb Посмотреть сообщение
Мне просто нужно, чтобы у всех производных классов наследуемые методы имели одинаковые значения.
Методы не имеют значений. Строго говоря имена функций это указатели и их значения это адреса. Они и так одинаковы для невиртуальных методов так как, каждый раз (по одному имени) это одна и та же функция.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.02.2020, 01:35
Помогаю со студенческими работами здесь

Создать базовый класс с четырьмя целыми полями и два производных класса
1) Создать базовый класс с четырьмя целыми полями. Разработать два конструктора: первый – без параметров – заполняет поля случайными...

Создать базовый класс с двумя целыми полями и два производных: «Обыкновенная дробь» и «Прямоугольник»
Создать базовый класс с двумя целыми полями. Разработать два конструктора: первый – без параметров – заполняет поля случайными данными;...

Создать базовый класс и два производных от него: «Окружность на плоскости» и «Точка в трехмерном пространстве»
1) Создать базовый класс с тремя целыми полями. Разработать два конструктора: первый – без параметров – заполняет поля случайными данными;...

Создать базовый класс с одним целым полем и два производных «Натуральное число» и «Массив натуральных чисел»
1) Создать базовый класс с одним целым полем. Разработать два конструктора: первый – без параметров – заполняет поле случайным...

единый элемент для всех страниц
Здравствуйте ! Помогите разобраться ! как сделать элемент на веб-странице, который повторяеться на всех страницах , и чтоб его можно было ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru