Форум программистов, компьютерный форум 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 ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
01.08.2013, 15:44  [ТС]     Наследование класс1 *test = new класс2 #41
Цитата Сообщение от Schizorb Посмотреть сообщение
test - это не объект, а указатель, он просто хранит адрес объекта. В указателе никак не прописано, на объект какого именно класса он указывает - базового или производного.
Тогда вопрос, BaseClass *test = new DerivedClass, если test указывает на объект класса DerivedClass т.е. конечный объект будет объектом класса DerivedClass, то какой смысл в данной записи несет "слово" BaseClass для чего оно тут?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11810 / 6789 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 15:49     Наследование класс1 *test = new класс2 #42
Что-то вроде этого:
Наследование класс1 *test = new класс2
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
01.08.2013, 16:21  [ТС]     Наследование класс1 *test = new класс2 #43
Жесть конечно с переходом на картинки, но что поделать..

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

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

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

class DerivedClass : public BaseClass

и print() НЕ virtual функция, show() virtual функция
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11810 / 6789 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 16:28     Наследование класс1 *test = new класс2 #44
Цитата Сообщение от VLK Посмотреть сообщение
опустим тот момент что когда используется virtual, что создается еще одна таблица исключительно с виртуальными функциями
Вот когда поймете как это устроено, тогда и проблем не будет, а если будете опускать всё подряд - ничего не поймете!
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
01.08.2013, 16:37  [ТС]     Наследование класс1 *test = new класс2 #45
Цитата Сообщение от Croessmah Посмотреть сообщение
Вот когда поймете как это устроено, тогда и проблем не будет, а если будете опускать всё подряд - ничего не поймете!
Я пытаюсь, но с каждый разом как я что то нащупываю, вы мне выдаете что то новое за место конкретного ответа, верно или нет, что все дальше и дальше уводит от истины.
Когда же начинаешь изучать С++, там же не объясняют сразу как работает ввод и вывод из потока (<< >>) т.к. это сложно, только в конце показывают. т.к. обучение должно идти от простого к сложному, а не только сложно.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11810 / 6789 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 16:39     Наследование класс1 *test = new класс2 #46
Цитата Сообщение от VLK Посмотреть сообщение
верно или нет
Как можно ответить верно или нет, если тут
Цитата Сообщение от VLK Посмотреть сообщение
опустим тот момент что когда используется virtual
и следом
Цитата Сообщение от VLK Посмотреть сообщение
show() virtual функция
Каша получается...тут помню, тут не помню )
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
01.08.2013, 16:40  [ТС]     Наследование класс1 *test = new класс2 #47
Цитата Сообщение от Croessmah Посмотреть сообщение
Каша получается...тут помню, тут не помню )
Мы опускаем таблицу с виртуальными функциями, а не само слово virtual
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11810 / 6789 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 16:41     Наследование класс1 *test = new класс2 #48
Цитата Сообщение от VLK Посмотреть сообщение
Мы опускаем таблицу с виртуальными функциями
Опускаем таблицу - нет динамического связывания, виртуальности, полиморфизма!
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
01.08.2013, 17:03  [ТС]     Наследование класс1 *test = new класс2 #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;
}


Всем принявшим участие в обсуждении данного вопроса спасибо, я для себя подчеркнул много нового и нашел критические ошибки в том, что я думал раньше.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11810 / 6789 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 17:36     Наследование класс1 *test = new класс2 #50

Не по теме:

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



Добавлено через 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 ;
}
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
01.08.2013, 17:53     Наследование класс1 *test = new класс2 #51
Цитата Сообщение от Croessmah Посмотреть сообщение
Слава Богу - я бессовестный
Слишком самокритично. Таблицы же опускают без нашего участия.
Цитата Сообщение от VLK Посмотреть сообщение
при записи BaseClass *test = new DerivedClass, test будет являться объектом класса DerivedClass (производного), но функция будет вызываться из базового класса, т.к. не указано к какой именно функции надо обращаться, что бы указать конкретно, что нужно обращаться к функции Производного класса, а не Базового,
VLK, лучше не так. В одном классе могут быть методы с одинаковыми именами, но разными типами и/или количеством параметров) и это перегрузка.
В классе наследнике могут быть не виртуальные методы полностью совпадающий по сигнатуре объявления с базовым и это переопределение. Вызов зависит от типа указателя.
В классе наследнике могут быть виртуальные методы полностью совпадающий по сигнатуре объявления с базовым и это полиморфное наследование. Вызов зависит не от типа указателя, а от того на что он указывает (чем инициализирован или что ему присвоено).
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
01.08.2013, 18:08  [ТС]     Наследование класс1 *test = new класс2 #52
Ну по большому счету, я ведь ни где не допустил в своем последнем примере критических ошибок? как до этого - BaseClass *test = new DerivedClass, test является объектом класса BaseClass
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11810 / 6789 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 18:32     Наследование класс1 *test = new класс2 #53
Цитата Сообщение от VLK Посмотреть сообщение
в своем последнем примере критических ошибок?
/* объект Two является объектом класса DerivedClass */
Two является указателем на объект класса BaseClass
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
01.08.2013, 18:58     Наследование класс1 *test = new класс2 #54
Цитата Сообщение от VLK Посмотреть сообщение
Ну по большому счету, я ведь ни где не допустил в своем последнем примере критических ошибок? как до этого - BaseClass *test = new DerivedClass, test является объектом класса BaseClass
Моя реплика не о том. Когда сталкиваешься с новым понятием, нет другого пути как сначала отнести его к уже известным. Признаки такого обобществления (синтеза) можно назвать доотличительными, а затем выделить (аналитически) те новые отличительные признаки которые определяют новизну этого понятия в полученной группе. В этом случае остается минимум признаков, запоминание которых, облегчается вскрытием их связей между собой. То есть не механически, а и алгоритмически (ассоциативно) запоминается. Запонимается можно бы даже и сказать. Глядя тему, там в начале уже видно, что про указатели их приведение к типу Вы где-то проглядели и вряд ли отличаете такую операцию от приведения к типу других переменных.
А ведь то о чём тут идёт речь, возможно только при косвенном обращении, - по указателю или по ссылке (это предлагаю раскопать самостоятельно, там всё также как и с указателями)). И подытожив, перефразирую одного великого человека: копать, копать и ещё раз копать.

Добавлено через 3 минуты
Croessmah, да я как раз про это. Тут нужно вернуться назад, пусть и не в С, конечно, но пройти по указателям и ссылкам нормально. Ведь сейчас полиморфное наследование без понимания простого наследования, это тот же стиль и результат будет тот же (имхо).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 21:06     Наследование класс1 *test = new класс2
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
02.08.2013, 21:06  [ТС]     Наследование класс1 *test = new класс2 #55
Цитата Сообщение от Croessmah Посмотреть сообщение
Two является указателем на объект класса BaseClass
Указатель, по адресу указателя хранится другой адрес, который ссылается непосредственно на объект (или конкретное значение)
В адресе Two хранится адрес объекта класса BaseClass, правильно?

Что бы не рыться, вот такая запись - BaseClass *Two = new DerivedClass;
где class DerivedClass : public BaseClass
Yandex
Объявления
02.08.2013, 21:06     Наследование класс1 *test = new класс2
Ответ Создать тему
Опции темы

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