Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Наследование в С++

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
SkySp



Зарегистрирован: 07.06.2005
Сообщения: 5
Откуда: Москва. Глубокое подполье.

СообщениеДобавлено: Вт Июн 07 2005 23:07    Заголовок сообщения: Наследование в С++ Ответить с цитатой

class A{};
class B: protected A{};// или private

void main(){
A* pa;
B b;
Arrow pa=&b; // error
//error C2243: 'type cast' : conversion from 'class B *' to 'class A *' exists, but is inaccessible
}

Если кто знает, объясните пожалста ПОЧЕМУ воникает ошибка?
// проверял на Visual c++ 6
_________________
Пять минут на перекур... две на все остальное...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Wladimir



Зарегистрирован: 02.03.2005
Сообщения: 150
Откуда: Ставропольский край

СообщениеДобавлено: Ср Июн 08 2005 07:32    Заголовок сообщения: Ответить с цитатой

А чего " : protected A", а не " : public A" ?
Так его protected-методы становятся недоступными.

Кроме того, возможно лучше здесь использовать
pa = dynamic_cast <A *>(&B) ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
SkySp



Зарегистрирован: 07.06.2005
Сообщения: 5
Откуда: Москва. Глубокое подполье.

СообщениеДобавлено: Ср Июн 08 2005 10:22    Заголовок сообщения: Ответить с цитатой

Как сделать так, чтоб работало я знаю (или если понадобится узнаю).
Я понять хочу почему это не работает и что за ошибка...
_________________
Пять минут на перекур... две на все остальное...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
kolobok0



Зарегистрирован: 22.04.2005
Сообщения: 253
Откуда: Мсква

СообщениеДобавлено: Ср Июн 08 2005 12:32    Заголовок сообщения: кхм... если прально понял... Ответить с цитатой

1) компилятору нуна указать какой тип использовать при приведении типов.
2) протектед или приват пофигу, пока обьект (класс) А не имеет членов. Ну не к кому обращаться и точка.

с уважением
_________________
(круглый)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
SkySp



Зарегистрирован: 07.06.2005
Сообщения: 5
Откуда: Москва. Глубокое подполье.

СообщениеДобавлено: Ср Июн 08 2005 18:35    Заголовок сообщения: Ответить с цитатой

kolobok0 писал(а):
1) компилятору нуна указать какой тип использовать при приведении типов.


ИМХО при приведении указателя на производный класс к указателю на базовый класс ничего не надо указывать...

kolobok0 писал(а):

2) протектед или приват пофигу, пока обьект (класс) А не имеет членов. Ну не к кому обращаться и точка.


Что значит членов?...
Компонентов, данных и методов (функций)?
Даже если рассмотреть случай с абстрактным классом...

class A{
protected:
int i;
public:
virtual void f()=0;
};

class B: protected A{
int j;
public:
void f() {j=i;}
};

void main(){
A* pa;
B b;
pa=&b;
pa->f();
}

Мне тут утверждают (преподаватель), что ошибки не будет...
_________________
Пять минут на перекур... две на все остальное...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
kolobok0



Зарегистрирован: 22.04.2005
Сообщения: 253
Откуда: Мсква

СообщениеДобавлено: Чт Июн 09 2005 11:39    Заголовок сообщения: Ответить с цитатой

SkySp писал(а):

ИМХО при приведении указателя на производный класс к указателю на базовый класс ничего не надо указывать...


замените
pa=&bx;
на
pa=(Ax*)&bx;

и будет Вам счастье. С лева у Вас указатель на "A" а в правой части у Вас берёться указатель от "B"

SkySp писал(а):

Что значит членов?...
Компонентов, данных и методов (функций)?
Даже если рассмотреть случай с абстрактным классом...

простите - наврал. на наличие реализации налетел - то другой случай (в практике часто случаеться).

SkySp писал(а):

Мне тут утверждают (преподаватель), что ошибки не будет...


будет... текст ошибки (кажеться именно такой и приводили)

error C2243: 'type cast' : conversion from 'Bx *__w64 ' to 'Ax *' exists, but is inaccessible


С уважением
_________________
(круглый)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
kolobok0



Зарегистрирован: 22.04.2005
Сообщения: 253
Откуда: Мсква

СообщениеДобавлено: Чт Июн 09 2005 12:07    Заголовок сообщения: дополнение... Ответить с цитатой

данная ошибка происходит именно от уровня доступа. если он паблик - приведение типов не потребуеться - тип "A" виден. И на оборот, если Вы явно укажите компилятору привести к "A" то он приведёт к "A". Попробуйте убрать у класса "B" наследование от "A". И явно привидите к типу "A". Компилятор сожрёт. Но экземпляр будет вовсе не класса "A" Smile
_________________
(круглый)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
SkySp



Зарегистрирован: 07.06.2005
Сообщения: 5
Откуда: Москва. Глубокое подполье.

СообщениеДобавлено: Пт Июн 10 2005 08:01    Заголовок сообщения: Большое спасибо Ответить с цитатой

Спасибо, kolobok0. Very Happy
_________________
Пять минут на перекур... две на все остальное...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...