Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2012, 18:50   #1
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию си++ - "совместимость" класса-родителя и его потомка

Доброго времени суток)

Друзья. подскажите пожалуйста -
допустимо ли вместо родителя в си++ "использовать" наследника -
подобным образом :

Код:
class A
{ 
  public:
       int i;
};
class B: public A
{
   public:
         int i;
};

class C 
{
  public:
   A someA;
  C()
  {
     B* oneB= new oneB(); 
     C::someA = oneB; // Допустимо ли это?
  }

}
И вообще - можно ли передавать в конструктор вместо класса-родителя ,его "потомка" ? (выше параметры не передаюся - просто попытка неявного "преобразования" что ли...)

Да - конечно - это не праздный вопрос - просто студия от мелкомягких говорит, что судя по всему нельзя - но там у меня более навороченая иерархия классов - потому я спрашиваю на простом примере.

Пожалуйста подскажите_

Заранее благодарю за ответ)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 21.10.2012, 19:05   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
студия от мелкомягких говорит, что судя по всему нельзя
Код:
someA = *oneB;
не?
А вот насчет эстетической стороны вопроса это уже труднее вот так вот с потолка сказать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.10.2012, 19:21   #3
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

опять слабый мозг не справился с понимаем концепции указателей и звёзд в си++....
Stilet , прокомментируйте пожалуйста наличие звезды =
Код:
*oneB
правильно ли , что это означает "область памяти по адресу oneB" ?
или нет...

но с точки зрения совместимости я "угадал"...
просто пишу ООП-иллюстрацию работы с классами - и там класс компьютер "агрегирует" класс "процессор" - потому удобно прописать в качестве стандартного параметра "родитель всех процессоров" , а уж в качестве конкретного параметра передавать объект конкретного класса - с большим числом составных элементов (полей-методов)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 21.10.2012, 19:33   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
прокомментируйте пожалуйста наличие звезды
Можно на "ты". Просто одному указателю предлагаю присваивать другой. Хотя это с потолка, когда-то в похожей ситуации поступал, но точно как выглядело решение не помню, и было это на досовском Си, не факт что сейчас это пройдет.

P.S. Кстати то что ты хочешь по-моему в таком ракурсе не имеет смысла, ибо наследник имеет доступ ко всем public полям класса.
I'm learning to live...

Последний раз редактировалось Stilet; 21.10.2012 в 19:41.
Stilet вне форума Ответить с цитированием
Старый 21.10.2012, 19:49   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

присвоить обьект класса A, обьекту класса B(B родитель A) нельзя.
ибо физически это разные данные.

при работе со ссылками или указателями это реально.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.10.2012, 19:50   #6
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
Просто одному указателю предлагаю присваивать другой.
но ведь *oneB - это данные по указателю oneB, а someA - это указатель.....
тогда чтобы указателю присвоить указатель надо написать =

Код:
someA = oneB;
ну или (то же самое ) =
Код:
someA = &*oneB;

Цитата:
P.S. Кстати то что ты хочешь по-моему в таком ракурсе не имеет смысла, ибо наследник имеет доступ ко всем public полям класса.
да - имеет - и это хорошо) просто в этом случае я могу написать типа "магазина" комплектующих - передавай в качестве параметра в класс "компьютер" самые разные объекты-процессоры, например)

Цитата:
присвоить обьект класса A, обьекту класса B(B родитель A) нельзя.
ок. понял - значит неявное преобразование отсутствует. но "звезда" всё равно непонятна.
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось vedro-compota; 21.10.2012 в 19:53.
vedro-compota вне форума Ответить с цитированием
Старый 21.10.2012, 20:01   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
просто в этом случае я могу написать типа "магазина" комплектующих - передавай в качестве параметра в класс "компьютер" самые разные объекты-процессоры, например)
Не понял... Как такое может быть? Я не могу назвать компьютером только корпус, хотя он похож на понятие ПК.
Цитата:
но "звезда" всё равно непонятна.
Это моя корявая попытка намека на присвоение одному указателю другого.
По факту объекты это 4-байтовые указатели, и теоретически можно один указатель заменить другим. На практике это попахивает граблями, но не запрещено как таковое.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.10.2012, 20:11   #8
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
Не понял... Как такое может быть? Я не могу назвать компьютером только корпус, хотя он похож на понятие ПК.
согласен - не слишком логично) но надо же какой-то класс сделать "агрегатором" ) - можно назвать и по-другому)
Цитата:
По факту объекты это 4-байтовые указатели, и теоретически можно один указатель заменить другим.
теперь стало ясно...смелый приём)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 21.10.2012, 20:24   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

неявное преобразование по иерархии автоматически несуществует.
ибо разные классы имеют разные поля и тп.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.10.2012, 20:33   #10
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
ибо разные классы имеют разные поля и тп.
все потомки имеют .....да) точно) не все родительские поля)) хотел сначала написать, что "все" )
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Определение "Родителя" в иерархичском списке Radzhab Microsoft Office Excel 7 18.09.2012 18:09
Одинаковый хендл у "родителя" и "ребенка" Alex Cones Общие вопросы Delphi 7 12.05.2010 10:49
Помогите пожайлуста найти, кто человек "вконтакте", зная его "мэйл" Аксюнька1990 Помощь студентам 1 12.06.2009 06:16
Delphi. Создание нового класса, его "предков". Krechet Помощь студентам 0 26.04.2009 15:52