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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
#1

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

31.07.2013, 21:47. Просмотров 1850. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2013, 21:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование класс1 *test = new класс2 (C++):

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

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.07.2013, 21:53 #2
сделай функцию принт виртуальной и будет смысл
2
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
31.07.2013, 21:56  [ТС] #3
Цитата Сообщение от Jupiter Посмотреть сообщение
сделай функцию принт виртуальной и будет смысл
а данная запись используется только для virtual функций? (просто следующей темой я как раз хотел разобрать virtual)
0
stragger
39 / 39 / 2
Регистрация: 05.12.2011
Сообщений: 343
31.07.2013, 21:57 #4
Да ничем не отличается, кроме вызова конструктора производного класса, методы производного класса мы вызвать не можем, т.к. BaseClass про них ничего не знает. Если бы методы виртуальными были смысл бы был, а так бесполезный какой-то пример.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6472 / 3120 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
31.07.2013, 22:08 #5
VLK, у Вас нет запуска конструктора базового класса с параметрами в конструкторе дочернего класса с параметрами. Это возможно, но скорее всего неправильно.
Jupiter, намекает, что при неполиморфном наследовании вызовы методов будут делаться как и без наследования вовсе.
И это правда. Представьте себе ещё, что у Вас есть ф-я принимающая указатель на базовый класс, а Вам нужен доступ к полям объектов и дочернего класса (общим с базовым типом) в этой функции. Тогда тоже имеет смысл создавать указатели на базовый и инициализировать их указателями на наследников, что бы передать.
0
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
31.07.2013, 22:11  [ТС] #6
IGPIGP, т.е. без использования virtual функций ну и без запуска конструктора базового класса данный пример, а точнее данная запись не имеет смысла?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6472 / 3120 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
31.07.2013, 22:14 #7
Цитата Сообщение от VLK Посмотреть сообщение
ну и без запуска конструктора базового класса
это не имеет отношения к Вашему вопросу. Просто обычно поля базового класса для наследника имеют смысл.
0
Croessmah
Эксперт CЭксперт С++
13234 / 7506 / 846
Регистрация: 27.09.2012
Сообщений: 18,437
Записей в блоге: 3
Завершенные тесты: 1
31.07.2013, 22:14 #8
Цитата Сообщение от VLK Посмотреть сообщение
а точнее данная запись не имеет смысла?
Зато показывает, что без использования полиморфизма используется статическое связывание, поэтому все функции будут проставлены в зависимости от типа указателя, а не от типа созданного реально объекта, как это было бы если бы функции были виртуальны и использовалось бы динамическое связывание
0
IGPIGP
31.07.2013, 22:16
  #9

Не по теме:

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

0
Croessmah
Эксперт CЭксперт С++
13234 / 7506 / 846
Регистрация: 27.09.2012
Сообщений: 18,437
Записей в блоге: 3
Завершенные тесты: 1
31.07.2013, 22:18 #10
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тут сигнатуры разные.
где?
C++
1
2
3
4
5
6
7
8
9
10
//BaseClass
void print() const 
{
//...
}
//DerivedClass
void print() const 
{
//...
}
1
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
31.07.2013, 22:22  [ТС] #11
Ладно, не уходите далеко, сейчас я про virtual задам вопрос
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6472 / 3120 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
31.07.2013, 22:27 #12
Цитата Сообщение от Croessmah Посмотреть сообщение
где?
Верно, не углядел, что там каждой ф-и по паре.
0
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
31.07.2013, 22:32  [ТС] #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, почему так?
0
Croessmah
Эксперт CЭксперт С++
13234 / 7506 / 846
Регистрация: 27.09.2012
Сообщений: 18,437
Записей в блоге: 3
Завершенные тесты: 1
31.07.2013, 22:34 #14
Цитата Сообщение от VLK Посмотреть сообщение
31, должен был выполнится метод из базового класса
С чего вдруг?
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.07.2013, 22:34 #15
Цитата Сообщение от VLK Посмотреть сообщение
Странно, до этого тестировал другие подобные программы, при вызове функции в строчке 31, должен был выполнится метод из базового класса (хоть и объект производного класса), но в этой примере почему то из класса DerivedClass, почему так?
нет, это вы нам объясните почему вы так думаете
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2013, 22:34
Привет! Вот еще темы с ответами:

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

Переименовать ссылку с такой http://test-site.ru/manage на http://test-site.ru/script.php?params=manage - Apache, htaccess
помогите переименовать ссылку с такой http://test-site.ru/manage на http://test-site.ru/script.php?params=manage ...

Реализовать функцию (@COUNT object list test) и (@COUNT-IF test list) - Lisp
Реализовать функции (@COUNT object list test) и (@COUNT-IF test list) , возвращающие количество элементов в списке list, для которых (test...

Test={pero:"lorem"} var t="pero"; console.log(test.t) возможно ли такое ? - JavaScript
Здравствуйте возможно ли такое ? и если да как правильно это написать ? var test={ pero: &quot;lorem 000&quot;, ats: &quot;lorem 123&quot;, kor:...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.07.2013, 22:34
Ответ Создать тему
Опции темы

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