Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236

Наследование класс1 *test = new класс2

31.07.2013, 21:47. Показов 4190. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кликните здесь для просмотра всего текста
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
63
64
65
#include <iostream> 
 
class BaseClass // Базовый класс
{
public:
BaseClass(): a(0), b(0) { std::cout << "BaseClass constructor.. \n"; }
BaseClass(int rhs_a, int rhs_b): a(rhs_a), b(rhs_b) { std::cout << "BaseClass constructor.. \n"; }
 
void print() const 
{
std::cout << "a: " << a << "\n";
std::cout << "b: " << a << "\n";
}
 
void printBaseClass() const 
{
std::cout << "a: " << a << "\n";
std::cout << "b: " << a << "\n";
}
 
protected:
int a;
int b;
};
 
 
class DerivedClass : public BaseClass // Производный класс от BaseClass
{
public:
DerivedClass(): x(0), y(0), z(0) { std::cout << "DerivedClass constructor.. \n"; }
DerivedClass(int rhs_x, int rhs_y, int rhs_z): x(rhs_x), y(rhs_y), z(rhs_z) { std::cout << "DerivedClass constructor.. \n"; }
 
void print() const 
{
std::cout << "x: " << x << "\n";
std::cout << "y: " << y << "\n";
std::cout << "z: " << z << "\n";
}
 
void printDerivedClass() const 
{
std::cout << "x: " << x << "\n";
std::cout << "y: " << y << "\n";
std::cout << "z: " << z << "\n";
}
 
protected:
int x;
int y;
int z;
};
 
 
int main()
{
setlocale(LC_ALL,"");
 
BaseClass * test = new DerivedClass;
test->print();
test->printBaseClass();
 
 
system("pause");
return 0;
}


Вот небольшая программка, подскажите в чем смысл записи в строчке 58, только не сухое определение записи, что мы создаем объект класса BaseClass и выделяем под него память типа DerivedClass (или как то так), а на пальцах, в чес смысл в чем плюсы и самое главное
чем данная строка отличалась бы от записи BaseClass * test = new BaseClass ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2013, 21:47
Ответы с готовыми решениями:

Задача на класс2
Помогите до реализовать форму программы Спасибо)

Nginx перенаправляет на http://site.ru/test.ru или http://test.ru/test.ru
Только, что поставил nginx + php-fpm по этой статье - http://dunmaksim.blogspot.ru/2013/12/nginx-php-fpm.html При попытке зайти на сайт...

C:\Projects\test\test.cpp|6|error: ISO C++ forbids declaration of 'operator++' with no type [-fpermissive]|
class TUID { public: char Data; TUID (); operator ++ (); };

54
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
31.07.2013, 21:53
сделай функцию принт виртуальной и будет смысл
2
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
31.07.2013, 21:56  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
сделай функцию принт виртуальной и будет смысл
а данная запись используется только для virtual функций? (просто следующей темой я как раз хотел разобрать virtual)
0
40 / 40 / 5
Регистрация: 05.12.2011
Сообщений: 343
31.07.2013, 21:57
Да ничем не отличается, кроме вызова конструктора производного класса, методы производного класса мы вызвать не можем, т.к. BaseClass про них ничего не знает. Если бы методы виртуальными были смысл бы был, а так бесполезный какой-то пример.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
31.07.2013, 22:08
VLK, у Вас нет запуска конструктора базового класса с параметрами в конструкторе дочернего класса с параметрами. Это возможно, но скорее всего неправильно.
Jupiter, намекает, что при неполиморфном наследовании вызовы методов будут делаться как и без наследования вовсе.
И это правда. Представьте себе ещё, что у Вас есть ф-я принимающая указатель на базовый класс, а Вам нужен доступ к полям объектов и дочернего класса (общим с базовым типом) в этой функции. Тогда тоже имеет смысл создавать указатели на базовый и инициализировать их указателями на наследников, что бы передать.
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
31.07.2013, 22:11  [ТС]
IGPIGP, т.е. без использования virtual функций ну и без запуска конструктора базового класса данный пример, а точнее данная запись не имеет смысла?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
31.07.2013, 22:14
Цитата Сообщение от VLK Посмотреть сообщение
ну и без запуска конструктора базового класса
это не имеет отношения к Вашему вопросу. Просто обычно поля базового класса для наследника имеют смысл.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
31.07.2013, 22:14
Цитата Сообщение от VLK Посмотреть сообщение
а точнее данная запись не имеет смысла?
Зато показывает, что без использования полиморфизма используется статическое связывание, поэтому все функции будут проставлены в зависимости от типа указателя, а не от типа созданного реально объекта, как это было бы если бы функции были виртуальны и использовалось бы динамическое связывание
0
31.07.2013, 22:16

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
се функции будут проставлены в зависимости от типа указателя
Тут сигнатуры объявления (имена) разные. :)

0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
31.07.2013, 22:18
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тут сигнатуры разные.
где?
C++
1
2
3
4
5
6
7
8
9
10
//BaseClass
void print() const 
{
//...
}
//DerivedClass
void print() const 
{
//...
}
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
31.07.2013, 22:22  [ТС]
Ладно, не уходите далеко, сейчас я про virtual задам вопрос
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
31.07.2013, 22:27
Цитата Сообщение от Croessmah Посмотреть сообщение
где?
Верно, не углядел, что там каждой ф-и по паре.
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
31.07.2013, 22:32  [ТС]
Кликните здесь для просмотра всего текста
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
#include <iostream> 
 
 
class BaseClass // Базовый класс
{
public:
BaseClass() { std::cout << "BaseClass constructor.. \n"; }
virtual ~BaseClass() { std::cout << "BaseClass destructor.. \n"; }
 
virtual void print() const
{ std::cout << "in BaseClass \n"; }
};
 
 
class DerivedClass : public BaseClass // Производный класс от BaseClass
{
public:
DerivedClass() { std::cout << "DerivedClass constructor.. \n"; }
virtual ~DerivedClass() { std::cout << "DerivedClass destructor.. \n"; }
 
virtual void print() const
{ std::cout << "in DerivedClass \n"; }
};
 
 
int main()
{
setlocale(LC_ALL,"");
 
DerivedClass test;
test.print();
 
system("pause");
return 0;
}


Странно, до этого тестировал другие подобные программы, при вызове функции в строчке 31, должен был выполнится метод из базового класса (хоть и объект производного класса), но в этой примере почему то из класса DerivedClass, почему так?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
31.07.2013, 22:34
Цитата Сообщение от VLK Посмотреть сообщение
31, должен был выполнится метод из базового класса
С чего вдруг?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
31.07.2013, 22:34
Цитата Сообщение от VLK Посмотреть сообщение
Странно, до этого тестировал другие подобные программы, при вызове функции в строчке 31, должен был выполнится метод из базового класса (хоть и объект производного класса), но в этой примере почему то из класса DerivedClass, почему так?
нет, это вы нам объясните почему вы так думаете
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
31.07.2013, 22:38
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
63
64
65
66
67
68
69
70
71
72
#include <iostream> 
 
class BaseClass // Базовый класс
{
public:
BaseClass(): a(0), b(0) { std::cout << "BaseClass constructor.. \n"; }
BaseClass(int rhs_a, int rhs_b): a(rhs_a), b(rhs_b) { std::cout << "BaseClass constructor.. \n"; }
 
void print() const 
{
std::cout << "a: " << a << "\n";
std::cout << "b: " << b << "\n";
}
 
void printBaseClass() const 
{
std::cout << "a: " << a << "\n";
std::cout << "b: " << b << "\n";
}
 
protected:
int a;
int b;
};
 
 
class DerivedClass : public BaseClass // Производный класс от BaseClass
{
public:
DerivedClass(): x(0), y(0), z(0) { std::cout << "DerivedClass constructor.. \n"; }
DerivedClass(int _a, int _b, int rhs_x, int rhs_y, int rhs_z)
: BaseClass(_a, _b), x(rhs_x), y(rhs_y), z(rhs_z) { std::cout << "DerivedClass constructor.. \n"; }
 
void print() const 
{
std::cout << "x: " << x << "\n";
std::cout << "y: " << y << "\n";
std::cout << "z: " << z << "\n";
}
 
void printDerivedClass() const 
{
std::cout << "x: " << x << "\n";
std::cout << "y: " << y << "\n";
std::cout << "z: " << z << "\n";
}
 
protected:
int x;
int y;
int z;
};
 
 
void foo(BaseClass * test){
test->print();
test->printBaseClass();
}
 
int main()
{
setlocale(LC_ALL,"");
 
 
BaseClass * test2 = new BaseClass(6,7);
BaseClass * test = new DerivedClass(1,2,3,4,5);//где-то Вам допустим и этот нужен)
foo(test);
std::cout<<"А теперь горбатый!"<<std::endl;
foo(test2);
system("pause");
return 0;
}
Может какой-то смысл есть и в этом. Но полиморфный вызов не получится. Более того typeinfo тоже покажет что это один и тот же тип. Виртуальная хоть одна, но нужна.
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
31.07.2013, 22:45  [ТС]
Я ошибся, ни при такой записи, а только при записи типа BaseClass *test = new DerivedClass

Кликните здесь для просмотра всего текста
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
#include <iostream> 
 
 
class BaseClass // Базовый класс
{
public:
BaseClass() { std::cout << "BaseClass constructor.. \n"; }
virtual ~BaseClass() { std::cout << "BaseClass destructor.. \n"; }
 
 void print() const
{ std::cout << "in BaseClass \n"; }
};
 
 
class DerivedClass : public BaseClass // Производный класс от BaseClass
{
public:
DerivedClass() { std::cout << "DerivedClass constructor.. \n"; }
virtual ~DerivedClass() { std::cout << "DerivedClass destructor.. \n"; }
 
 void print() const
{ std::cout << "in DerivedClass \n"; }
};
 
 
int main()
{
setlocale(LC_ALL,"");
 
BaseClass *test = new DerivedClass;
test->print();
 
system("pause");
return 0;
}


Вот без virtual, мы создаем объект базового класса и соответственно функция print будет вызываться из базового класса

Кликните здесь для просмотра всего текста
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
#include <iostream> 
 
 
class BaseClass // Базовый класс
{
public:
BaseClass() { std::cout << "BaseClass constructor.. \n"; }
virtual ~BaseClass() { std::cout << "BaseClass destructor.. \n"; }
 
virtual void print() const
{ std::cout << "in BaseClass \n"; }
};
 
 
class DerivedClass : public BaseClass // Производный класс от BaseClass
{
public:
DerivedClass() { std::cout << "DerivedClass constructor.. \n"; }
virtual ~DerivedClass() { std::cout << "DerivedClass destructor.. \n"; }
 
virtual void print() const
{ std::cout << "in DerivedClass \n"; }
};
 
 
int main()
{
setlocale(LC_ALL,"");
 
BaseClass *test = new DerivedClass;
test->print();
 
system("pause");
return 0;
}


Тут мы уже используем virtual и уже вызывается функция print из производного класса..


Не знаю как правильно технически задать этот вопрос, но надеюсь вы там поймете, для этого и существуют virtual функции и записи типа BaseClass *test = new DerivedClass

Добавлено через 1 минуту
в этих мною написанных программах, полиморфизм, он заключается в том что один объект, в данном случае test, одновременно является объектом класса BaseClass и объектом класса DerivedClass?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
31.07.2013, 22:47
Цитата Сообщение от VLK Посмотреть сообщение
в данном случае test, одновременно является объектом класса BaseClass и объектом класса DerivedClass
Скажем так, что объект производного класса умеет делать все тоже самое, что и объект базового.
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
31.07.2013, 22:51  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Скажем так, что объект производного класса умеет делать все тоже самое, что и объект базового.
Если так по колхозному, то класс имеет 2 вещи, первое это переменные и второе функции (методы), получается что объект производного класса так же получает и переменные базового класса?
0
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
31.07.2013, 22:53
Цитата Сообщение от VLK Посмотреть сообщение
в данном случае test, одновременно является объектом класса BaseClass и объектом класса DerivedClass?
Именно является, это основная фишка открытого наследования.

Добавлено через 1 минуту
Цитата Сообщение от VLK Посмотреть сообщение
что объект производного класса так же получает и переменные базового класса?
Он целиком содержит в себе объект базового класса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.07.2013, 22:53
Помогаю со студенческими работами здесь

Функция file_exists(test/01.ogg) работает, если папка test находится в корневом каталоге моего сервера.
Столкнулся с интересной проблеммой. Функция file_exists(test/01.ogg) работает, если папка test находится в корневом каталоге моего...

Что такое unit test и regression test
Что такое unit test и regression test?

Запишите в файл test.out все строки из файла test.in, в которых встречается слово "Hello"
В файле test.in записан текст на английском языке. Запишите в файл test.out все строки из файла test.in, в которых встречается слово...

Почему команда «dir>test.txt» работает, а команда «ftp /?>test.txt» — нет?
Пробовала без пробелов, что тут еще можно попробовать непонятно Выводит в окно командной строки. Как исправить?

У себя на локале я пишу ссылку test.php?city=1 и в test.php он видет $city==1
У себя на локале я пишу ссылку test.php?city=1 и в test.php он видет $city==1 А на хосте не видет. Че это за херня?????


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru