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

Наследование/классы - C++

Восстановить пароль Регистрация
 
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
04.03.2011, 12:45     Наследование/классы #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class BaseClass
{
public:
    void print() { std::cout << "123\r\n"; }
};
 
class DirivedClass: public BaseClass
{
public:
    void print() { std::cout << "321\r\n"; }    
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    DirivedClass* dClass = static_cast<DirivedClass*>(new BaseClass);
    BaseClass* bClass = dClass;
 
    dClass->print();
 
    system("pause");
    return 0;
}
почему выводится 321 ? ведь new BaseClass
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2011, 12:45     Наследование/классы
Посмотрите здесь:

классы. Наследование C++
Классы. Наследование C++
C++ Классы и наследование.
Классы, наследование C++
C++ Классы и наследование
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dexter
 Аватар для Dexter
284 / 144 / 16
Регистрация: 13.10.2009
Сообщений: 164
04.03.2011, 13:26     Наследование/классы #2
Ничего необычного, для вашего кода все правильно, если же надо чтобы выполнялась функция из класса BaseClass, то функцию show нужно было определить как виртуальную.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class BaseClass
{
public:
    virtual void print() { std::cout << "123\r\n"; }
};
 
class DirivedClass: public BaseClass
{
public:
    void print() { std::cout << "321\r\n"; }        
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    DirivedClass* dClass = static_cast<DirivedClass*>(new BaseClass);
    BaseClass* bClass = dClass;
 
    dClass->print();
 
    system("pause");
    return 0;
}
результат будет 123
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
04.03.2011, 13:36  [ТС]     Наследование/классы #3
Как сделать, что бы работало я знаю. Просто для меня это как-то странно. Откуда он вообще знает о DirivedClass ?

C++
1
new BaseClass
Сл. я выделяю память только под BaseClass ,"321\r\n" вообще быть не должно ?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.03.2011, 16:36     Наследование/классы #4
Когда вы преобразовываете BaseClass к DirivedClass, print будет браться из DirivedClass, потому что и у того, и у другого есть функции print, но они, естественно, находятся в разных участках памяти. Т.е. когда объект преобразовывается из одного типа в другой (в данном случае из базового в производный), все такие ссылки переписываются, и теперь идентификатор print будет связан с областью памяти, отвечающей за функцию print из DirivedClass.
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
04.03.2011, 20:24  [ТС]     Наследование/классы #5
вроде сложилась кое какая картинка насчет данной фичи.

получается
std::cout << "321\r\n";

строка "321" будет находится в одном участке памяти для всех экземпляров класса. Надо будет учесть этот момент.В многопоточных классах могут быть косяки из за этого поидеи.
Миниатюры
Наследование/классы  
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.03.2011, 20:25     Наследование/классы #6
Saiberg, естественно. Мало того, весь код всех методов класса хранится в единственном экземпляре. А зачем хранить одну и ту же функцию в каждом объекте?
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
04.03.2011, 20:29  [ТС]     Наследование/классы #7
Не знаю , мне казалось компилятор так делает
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.03.2011, 21:27     Наследование/классы #8
Saiberg, ну а представьте ситуацию, что у нас есть класс, единственная переменная в котором - переменная целого типа (вот такой странный класс). Зато там есть 20 методов, по 300 строк в каждом. И пользователь захотел создать массив из 10000 экземпляров такого класса. И теперь представьте, сколько лишнего кода будет лежать в сегменте кода...
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
04.03.2011, 22:31  [ТС]     Наследование/классы #9
ога. спс разобрался.

подытожив:
Все происходит из за того , что методы класса таки просто функции и могут вызывается без создания экземпляра класса, что тут и происходит.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.03.2011, 22:33     Наследование/классы #10
Точно
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
04.03.2011, 22:43     Наследование/классы #11
Цитата Сообщение от Saiberg Посмотреть сообщение
подытожив:
Все происходит из за того , что методы класса таки просто функции и могут вызывается без создания экземпляра класса, что тут и происходит.
фактически методы это функции, в которые неявно передается указатель this, для того чтобы функции могли иметь доступ к данным объекта, например this->pole
плюс к этому если есть виртуальные функции, то каждый объект имеет поле pVtbl - указатель на массив функций именно этого объектов этого типа, который вызывающий контекст будет использовать, чтобы вызвать правильную функцию при неизвестном конечном классе

Цитата Сообщение от DexterUa Посмотреть сообщение
DirivedClass* dClass = static_cast<DirivedClass*>(new BaseClass);
здесь надо использовать dynamic_cast
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.03.2011, 22:51     Наследование/классы #12
Цитата Сообщение от alex_x_x Посмотреть сообщение
здесь надо использовать dynamic_cast
Хм... А зачем? Ведь мы заранее знаем, к какому типу хотим преобразовать указатель и что этот тип будет являться верным. dynamic_cast нужен тогда, когда, к примеру, массив указателей на экземпляры базового класса заполняется во время выполнения программы в зависимости, скажем, от желания пользователя (т.е. каждый раз по-разному). А тут всё известно до компиляции.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
04.03.2011, 23:00     Наследование/классы #13
silent_1991, ну он предназначен для полиморфного преобразования
тут может без разницы, а так безопасней, хотя бы проверить можно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.03.2011, 23:07     Наследование/классы #14
alex_x_x, ну так тут проверять нечего, поэтому вполне сойдёт static_cast.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
04.03.2011, 23:08     Наследование/классы #15
кстати извиняюсь, dynamic_cast тут нельзя использовать, классы неполиморфные

Добавлено через 19 секунд
silent_1991, по-другому и работать не будет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2011, 23:11     Наследование/классы
Еще ссылки по теме:

C++ Классы, наследование
C++ Классы и наследование
Классы и наследование c++ C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.03.2011, 23:11     Наследование/классы #16
alex_x_x, ха, и правда... Я, честно говоря, никогда не пытался применять dynamic_cast не по назначению... Думал, будет работать.
Yandex
Объявления
04.03.2011, 23:11     Наследование/классы
Ответ Создать тему
Опции темы

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