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

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

Войти
Регистрация
Восстановить пароль
 
 
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
#1

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

04.03.2011, 12:45. Просмотров 880. Ответов 15
Метки нет (Все метки)

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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2011, 12:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование/классы (C++):

Наследование, базовые классы и производные классы - C++
Добрый вечер.Задание: необходимо разработать поля и методы наследуемые из базового класса и собственные компоненты производных...

Классы и наследование (Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию вычисления объёма.) - C++
Уважаевые, помогите написать прожку на экзамене: Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию...

Классы и их наследование - C++
Начал изучать С++ и ООП после того как понял немного осоновы. И вот столкнулся с чем. Есть базовый класс, есть класс-наслденик, базовый...

Классы и наследование - C++
Помогите , пожалуйста! Нужно с помощью наследования записать количество проданного товара и функцию нахождения остатка товара. !Не...

Наследование. Классы. C++ - C++
Наверное мой вопрос будет смешным, но я действительно не могу придумать методы и свойства. Я совсем запуталась что чем является, и не могу...

Классы и наследование - C++
Реализовать класс−оболочку Number для числового типа double. Реализовать методы умножения и вычитания. Создать производный класс Real, в...

15
Dexter
285 / 145 / 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
1
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
04.03.2011, 13:36  [ТС] #3
Как сделать, что бы работало я знаю. Просто для меня это как-то странно. Откуда он вообще знает о DirivedClass ?

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

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

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

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

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

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

Классы. Наследование - C++
Приветствую всех участников форума! Требуется помощь. Итак, задание Написать программу, демонстрирующую работу с объектами двух...

Классы и наследование - C++
Доброго времени суток. Помогите решить задание. Дан класс pegasus ,у которого родительский класс horse, надо переделать код, чтобы при...

Классы, наследование - C++
Собственно, задача поставлена так, в файле N логинов и паролей, которые считываются и проверяются с теми что введены с клавиатуры. ...

Классы, наследование - C++
как сделать, что бы вызывался деструктор B? Кроме как &quot;delete (B*)var;&quot; class A { public: A(){ cout &lt;&lt; &quot;A's...


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

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

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