Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
SkySp
Зарегистрирован: 07.06.2005 Сообщения: 5 Откуда: Москва. Глубокое подполье.
|
Добавлено: Вт Июн 07 2005 23:07 Заголовок сообщения: Наследование в С++ |
|
|
class A{};
class B: protected A{};// или private
void main(){
A* pa;
B b;
pa=&b; // error
//error C2243: 'type cast' : conversion from 'class B *' to 'class A *' exists, but is inaccessible
}
Если кто знает, объясните пожалста ПОЧЕМУ воникает ошибка?
// проверял на Visual c++ 6 _________________ Пять минут на перекур... две на все остальное... |
|
Вернуться к началу |
|
|
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 Заголовок сообщения: |
|
|
Как сделать так, чтоб работало я знаю (или если понадобится узнаю).
Я понять хочу почему это не работает и что за ошибка... _________________ Пять минут на перекур... две на все остальное... |
|
Вернуться к началу |
|
|
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();
}
Мне тут утверждают (преподаватель), что ошибки не будет... _________________ Пять минут на перекур... две на все остальное... |
|
Вернуться к началу |
|
|
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" _________________ (круглый) |
|
Вернуться к началу |
|
|
SkySp
Зарегистрирован: 07.06.2005 Сообщения: 5 Откуда: Москва. Глубокое подполье.
|
Добавлено: Пт Июн 10 2005 08:01 Заголовок сообщения: Большое спасибо |
|
|
Спасибо, kolobok0. _________________ Пять минут на перекур... две на все остальное... |
|
Вернуться к началу |
|
|
|