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

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

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

Author24 — интернет-сервис помощи студентам
Кликните здесь для просмотра всего текста
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2013, 21:47
Ответы с готовыми решениями:

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

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

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

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

54
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
01.08.2013, 15:44  [ТС] 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Schizorb Посмотреть сообщение
test - это не объект, а указатель, он просто хранит адрес объекта. В указателе никак не прописано, на объект какого именно класса он указывает - базового или производного.
Тогда вопрос, BaseClass *test = new DerivedClass, если test указывает на объект класса DerivedClass т.е. конечный объект будет объектом класса DerivedClass, то какой смысл в данной записи несет "слово" BaseClass для чего оно тут?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.08.2013, 15:49 42
Что-то вроде этого:
Наследование класс1 *test = new класс2
2
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
01.08.2013, 16:21  [ТС] 43
Жесть конечно с переходом на картинки, но что поделать..

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


Я все правильно намалевал? опустим тот момент что когда используется virtual, что создается еще одна таблица исключительно с виртуальными функциями

Там есть некоторые недомолвки, в частности:

class DerivedClass : public BaseClass

и print() НЕ virtual функция, show() virtual функция
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.08.2013, 16:28 44
Цитата Сообщение от VLK Посмотреть сообщение
опустим тот момент что когда используется virtual, что создается еще одна таблица исключительно с виртуальными функциями
Вот когда поймете как это устроено, тогда и проблем не будет, а если будете опускать всё подряд - ничего не поймете!
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
01.08.2013, 16:37  [ТС] 45
Цитата Сообщение от Croessmah Посмотреть сообщение
Вот когда поймете как это устроено, тогда и проблем не будет, а если будете опускать всё подряд - ничего не поймете!
Я пытаюсь, но с каждый разом как я что то нащупываю, вы мне выдаете что то новое за место конкретного ответа, верно или нет, что все дальше и дальше уводит от истины.
Когда же начинаешь изучать С++, там же не объясняют сразу как работает ввод и вывод из потока (<< >>) т.к. это сложно, только в конце показывают. т.к. обучение должно идти от простого к сложному, а не только сложно.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.08.2013, 16:39 46
Цитата Сообщение от VLK Посмотреть сообщение
верно или нет
Как можно ответить верно или нет, если тут
Цитата Сообщение от VLK Посмотреть сообщение
опустим тот момент что когда используется virtual
и следом
Цитата Сообщение от VLK Посмотреть сообщение
show() virtual функция
Каша получается...тут помню, тут не помню )
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
01.08.2013, 16:40  [ТС] 47
Цитата Сообщение от Croessmah Посмотреть сообщение
Каша получается...тут помню, тут не помню )
Мы опускаем таблицу с виртуальными функциями, а не само слово virtual
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.08.2013, 16:41 48
Цитата Сообщение от VLK Посмотреть сообщение
Мы опускаем таблицу с виртуальными функциями
Опускаем таблицу - нет динамического связывания, виртуальности, полиморфизма!
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
01.08.2013, 17:03  [ТС] 49
К сожалению у меня нет много времени на разбирание всего этого, как говорится в процессе разберусь..
Для себя я сделал такой пример, буду им руководствоваться, если он не правильный, то это будет на вашей совести

Кликните здесь для просмотра всего текста
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
#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 - print() \n"; }
 
virtual void show() const
{ std::cout << "in BaseClass - virtual show() \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"; }
 
virtual void show() const
{ std::cout << "in DerivedClass - virtual show() \n"; }
};
 
/* ключевое слово virtual применяется для замещения функции, т.е. есть 2 класса, 
Базовый и Производный и в обоих есть одна и та же по наименованию функция, в таком случае
при записи BaseClass *test = new DerivedClass, test будет являться объектом класса  
DerivedClass (производного), но функция будет вызываться из базового класса, т.к. 
не указано к какой именно функции надо обращаться, что бы указать конкретно, 
что нужно обращаться к функции Производного класса, а не Базового, в Базовом классе 
перед этой функцией надо поставить ключевое слово virtual 
после того как в базом классе будет поставлено ключевое слово virtual, то во всех 
производных классах все функции с таким же именем станут virtual и перед ними не обязательно 
писать ключевое слово virtual, но желательно для ясности программы */
 
int main()
{
DerivedClass *One = new DerivedClass;
One->print();
One->show();
/* В обоих случаях выше будет выполнена функция-элемент из 
класса DerivedClass вне зависимости virtual она или нет */
 
BaseClass *Two = new DerivedClass; /* объект Two является объектом класса DerivedClass */
Two->print();
Two->show();
/* При данной записи, слово virtual применяется для замещения функции
в первом варианте, без virtual, функция print() будет выведена из BaseClass класса
во втором случае функция show() будет выведена из DerivedClass класса благодаря применению 
ключевого слова virtual */
 
system("pause");
return 0;
}


Всем принявшим участие в обсуждении данного вопроса спасибо, я для себя подчеркнул много нового и нашел критические ошибки в том, что я думал раньше.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.08.2013, 17:36 50

Не по теме:

Цитата Сообщение от VLK Посмотреть сообщение
то это будет на вашей совести
Слава Богу - я бессовестный :yahoo:



Добавлено через 31 минуту
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
#include <iostream>
#include <vector>
#include <memory>
#include <string>
#include <cstdlib>
 
struct Item {
    virtual std::string Who ( ) const {
        return "Other item" ;
    }
    virtual ~Item ( ) {
        std::cout << "Destructor item" << std::endl ;
    }
} ;
 
struct Sofa : Item {
    virtual std::string Who ( ) const {
        return "Sofa" ;
    }
    virtual ~Sofa ( ) {
        std::cout << "Destructor sofa" << std::endl ;
    }
} ;
 
struct CupBoard : Item {
    virtual std::string Who ( ) const {
        return "Cupboard" ;
    }
    virtual ~CupBoard ( ) {
        std::cout << "Destructor cupboard" << std::endl ;
    }
} ;
 
 
int buyMenu ( ) {
    int menuSelect = 0 ;
    std::cout << "Buy item: \n"
        << "1 - Sofa\n"
        << "2 - Cupboard\n"
        << "Other - exit" << std::endl ;
    std::cin >> menuSelect ;
    std::cin.clear ( ) ;
    std::cin.ignore ( std::cin.rdbuf ( ) -> in_avail ( ) ) ;
    return ( ( menuSelect > 2 || menuSelect < 1 ) ? 0 : menuSelect ) ;
}
 
 
int main() {
   std::vector < std::shared_ptr < Item > > roomItems ;
    int itemSelect ;
    while ( itemSelect = buyMenu ( ) ) {
        switch ( itemSelect ) {
        case 1:
            roomItems.push_back ( std::shared_ptr < Item > ( new Sofa ) ) ;
            break ;
        case 2:
            roomItems.push_back ( std::shared_ptr < Item > ( new CupBoard ) ) ;
            break ;
        default:
            roomItems.push_back ( std::shared_ptr < Item > ( new Item ) ) ;
            break ;
        }
        system ( "cls" ) ;
    } ;
    for ( std::vector < std::shared_ptr < Item > >::const_iterator currentIterator = roomItems.begin ( ) ; currentIterator != roomItems.end ( ) ; ++currentIterator )
        std::cout << (*currentIterator)->Who ( ) << std::endl ;
   return 0 ;
}
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
01.08.2013, 17:53 51
Цитата Сообщение от Croessmah Посмотреть сообщение
Слава Богу - я бессовестный
Слишком самокритично. Таблицы же опускают без нашего участия.
Цитата Сообщение от VLK Посмотреть сообщение
при записи BaseClass *test = new DerivedClass, test будет являться объектом класса DerivedClass (производного), но функция будет вызываться из базового класса, т.к. не указано к какой именно функции надо обращаться, что бы указать конкретно, что нужно обращаться к функции Производного класса, а не Базового,
VLK, лучше не так. В одном классе могут быть методы с одинаковыми именами, но разными типами и/или количеством параметров) и это перегрузка.
В классе наследнике могут быть не виртуальные методы полностью совпадающий по сигнатуре объявления с базовым и это переопределение. Вызов зависит от типа указателя.
В классе наследнике могут быть виртуальные методы полностью совпадающий по сигнатуре объявления с базовым и это полиморфное наследование. Вызов зависит не от типа указателя, а от того на что он указывает (чем инициализирован или что ему присвоено).
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
01.08.2013, 18:08  [ТС] 52
Ну по большому счету, я ведь ни где не допустил в своем последнем примере критических ошибок? как до этого - BaseClass *test = new DerivedClass, test является объектом класса BaseClass
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.08.2013, 18:32 53
Цитата Сообщение от VLK Посмотреть сообщение
в своем последнем примере критических ошибок?
/* объект Two является объектом класса DerivedClass */
Two является указателем на объект класса BaseClass
2
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
01.08.2013, 18:58 54
Цитата Сообщение от VLK Посмотреть сообщение
Ну по большому счету, я ведь ни где не допустил в своем последнем примере критических ошибок? как до этого - BaseClass *test = new DerivedClass, test является объектом класса BaseClass
Моя реплика не о том. Когда сталкиваешься с новым понятием, нет другого пути как сначала отнести его к уже известным. Признаки такого обобществления (синтеза) можно назвать доотличительными, а затем выделить (аналитически) те новые отличительные признаки которые определяют новизну этого понятия в полученной группе. В этом случае остается минимум признаков, запоминание которых, облегчается вскрытием их связей между собой. То есть не механически, а и алгоритмически (ассоциативно) запоминается. Запонимается можно бы даже и сказать. Глядя тему, там в начале уже видно, что про указатели их приведение к типу Вы где-то проглядели и вряд ли отличаете такую операцию от приведения к типу других переменных.
А ведь то о чём тут идёт речь, возможно только при косвенном обращении, - по указателю или по ссылке (это предлагаю раскопать самостоятельно, там всё также как и с указателями)). И подытожив, перефразирую одного великого человека: копать, копать и ещё раз копать.

Добавлено через 3 минуты
Croessmah, да я как раз про это. Тут нужно вернуться назад, пусть и не в С, конечно, но пройти по указателям и ссылкам нормально. Ведь сейчас полиморфное наследование без понимания простого наследования, это тот же стиль и результат будет тот же (имхо).
2
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
02.08.2013, 21:06  [ТС] 55
Цитата Сообщение от Croessmah Посмотреть сообщение
Two является указателем на объект класса BaseClass
Указатель, по адресу указателя хранится другой адрес, который ссылается непосредственно на объект (или конкретное значение)
В адресе Two хранится адрес объекта класса BaseClass, правильно?

Что бы не рыться, вот такая запись - BaseClass *Two = new DerivedClass;
где class DerivedClass : public BaseClass
0
02.08.2013, 21:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2013, 21:06
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
55
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru