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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
31.07.2013, 21:47     Наследование класс1 *test = new класс2 #1
Кликните здесь для просмотра всего текста
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 ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.07.2013, 21:53     Наследование класс1 *test = new класс2 #2
сделай функцию принт виртуальной и будет смысл
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
31.07.2013, 21:56  [ТС]     Наследование класс1 *test = new класс2 #3
Цитата Сообщение от Jupiter Посмотреть сообщение
сделай функцию принт виртуальной и будет смысл
а данная запись используется только для virtual функций? (просто следующей темой я как раз хотел разобрать virtual)
stragger
38 / 38 / 2
Регистрация: 05.12.2011
Сообщений: 343
31.07.2013, 21:57     Наследование класс1 *test = new класс2 #4
Да ничем не отличается, кроме вызова конструктора производного класса, методы производного класса мы вызвать не можем, т.к. BaseClass про них ничего не знает. Если бы методы виртуальными были смысл бы был, а так бесполезный какой-то пример.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,715
Записей в блоге: 3
31.07.2013, 22:08     Наследование класс1 *test = new класс2 #5
VLK, у Вас нет запуска конструктора базового класса с параметрами в конструкторе дочернего класса с параметрами. Это возможно, но скорее всего неправильно.
Jupiter, намекает, что при неполиморфном наследовании вызовы методов будут делаться как и без наследования вовсе.
И это правда. Представьте себе ещё, что у Вас есть ф-я принимающая указатель на базовый класс, а Вам нужен доступ к полям объектов и дочернего класса (общим с базовым типом) в этой функции. Тогда тоже имеет смысл создавать указатели на базовый и инициализировать их указателями на наследников, что бы передать.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
31.07.2013, 22:11  [ТС]     Наследование класс1 *test = new класс2 #6
IGPIGP, т.е. без использования virtual функций ну и без запуска конструктора базового класса данный пример, а точнее данная запись не имеет смысла?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,715
Записей в блоге: 3
31.07.2013, 22:14     Наследование класс1 *test = new класс2 #7
Цитата Сообщение от VLK Посмотреть сообщение
ну и без запуска конструктора базового класса
это не имеет отношения к Вашему вопросу. Просто обычно поля базового класса для наследника имеют смысл.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,913
Записей в блоге: 2
Завершенные тесты: 1
31.07.2013, 22:14     Наследование класс1 *test = new класс2 #8
Цитата Сообщение от VLK Посмотреть сообщение
а точнее данная запись не имеет смысла?
Зато показывает, что без использования полиморфизма используется статическое связывание, поэтому все функции будут проставлены в зависимости от типа указателя, а не от типа созданного реально объекта, как это было бы если бы функции были виртуальны и использовалось бы динамическое связывание
IGPIGP
31.07.2013, 22:16
  #9

Не по теме:

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

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,913
Записей в блоге: 2
Завершенные тесты: 1
31.07.2013, 22:18     Наследование класс1 *test = new класс2 #10
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тут сигнатуры разные.
где?
C++
1
2
3
4
5
6
7
8
9
10
//BaseClass
void print() const 
{
//...
}
//DerivedClass
void print() const 
{
//...
}
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
31.07.2013, 22:22  [ТС]     Наследование класс1 *test = new класс2 #11
Ладно, не уходите далеко, сейчас я про virtual задам вопрос
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,715
Записей в блоге: 3
31.07.2013, 22:27     Наследование класс1 *test = new класс2 #12
Цитата Сообщение от Croessmah Посмотреть сообщение
где?
Верно, не углядел, что там каждой ф-и по паре.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
31.07.2013, 22:32  [ТС]     Наследование класс1 *test = new класс2 #13
Кликните здесь для просмотра всего текста
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, почему так?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,913
Записей в блоге: 2
Завершенные тесты: 1
31.07.2013, 22:34     Наследование класс1 *test = new класс2 #14
Цитата Сообщение от VLK Посмотреть сообщение
31, должен был выполнится метод из базового класса
С чего вдруг?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.07.2013, 22:34     Наследование класс1 *test = new класс2 #15
Цитата Сообщение от VLK Посмотреть сообщение
Странно, до этого тестировал другие подобные программы, при вызове функции в строчке 31, должен был выполнится метод из базового класса (хоть и объект производного класса), но в этой примере почему то из класса DerivedClass, почему так?
нет, это вы нам объясните почему вы так думаете
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,715
Записей в блоге: 3
31.07.2013, 22:38     Наследование класс1 *test = new класс2 #16
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 тоже покажет что это один и тот же тип. Виртуальная хоть одна, но нужна.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
31.07.2013, 22:45  [ТС]     Наследование класс1 *test = new класс2 #17
Я ошибся, ни при такой записи, а только при записи типа 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?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,913
Записей в блоге: 2
Завершенные тесты: 1
31.07.2013, 22:47     Наследование класс1 *test = new класс2 #18
Цитата Сообщение от VLK Посмотреть сообщение
в данном случае test, одновременно является объектом класса BaseClass и объектом класса DerivedClass
Скажем так, что объект производного класса умеет делать все тоже самое, что и объект базового.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
31.07.2013, 22:51  [ТС]     Наследование класс1 *test = new класс2 #19
Цитата Сообщение от Croessmah Посмотреть сообщение
Скажем так, что объект производного класса умеет делать все тоже самое, что и объект базового.
Если так по колхозному, то класс имеет 2 вещи, первое это переменные и второе функции (методы), получается что объект производного класса так же получает и переменные базового класса?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2013, 22:53     Наследование класс1 *test = new класс2
Еще ссылки по теме:

Ошибка при сборке проекта - invalid use of non-static data member 'MainWindow::test' C++
Выползает такая ошибка "test.exe вызвал срабатывание точки останова." C++
C++ После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result?

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

Или воспользуйтесь поиском по форуму:
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
31.07.2013, 22:53     Наследование класс1 *test = new класс2 #20
Цитата Сообщение от VLK Посмотреть сообщение
в данном случае test, одновременно является объектом класса BaseClass и объектом класса DerivedClass?
Именно является, это основная фишка открытого наследования.

Добавлено через 1 минуту
Цитата Сообщение от VLK Посмотреть сообщение
что объект производного класса так же получает и переменные базового класса?
Он целиком содержит в себе объект базового класса.
Yandex
Объявления
31.07.2013, 22:53     Наследование класс1 *test = new класс2
Ответ Создать тему
Опции темы

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