Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255

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

20.11.2010, 02:13. Показов 2607. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тёмного времени суток!
Столкнулся с проблемой, основной смысл которой заложен ниже
C++
1
2
3
4
5
6
7
8
9
10
class Parent 
{
void F() = 0;
}
class Child: protected Parent
{
void F() {}
}
 
Parent *ptr = new Child;
В результате ошибка
error C2243: 'type cast' : conversion from 'class ... *' to 'class ...*' exists, but is inaccessible
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.11.2010, 02:13
Ответы с готовыми решениями:

Заменить наследование классов на наследование интерфейсов
#include <iostream> #include <assert.h> using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Наследование
Написал код, но есть небольшая ошибка. Мне нужно, чтобы с клавиатуры вводилось имя (например James) и он сразу выводил по нему всю...

Наследование
Нужно создать функцию которая получает в качестве параметра фалимию и ее ищет в динамическом массиве структур и потом возвращает ее....

6
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.11.2010, 03:36
alexsvk,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Parent 
{
public:
    virtual void F() = 0;
};
 
class Child: public Parent
{
public:
void F() {}
};
 
int main()
{
    Parent *ptr = new Child;
}
1
Заблокирован
20.11.2010, 04:01
Цитата Сообщение от alexsvk Посмотреть сообщение
Тёмного времени суток!
Столкнулся с проблемой, основной смысл которой заложен ниже
C++
1
2
3
4
5
6
7
8
9
10
class Parent 
{
void F() = 0;
}
class Child: protected Parent
{
void F() {}
}
 
Parent *ptr = new Child;
В результате ошибка
error C2243: 'type cast' : conversion from 'class ... *' to 'class ...*' exists, but is inaccessible
Во-первых, спецификатор чистой функции есть ( = 0 ), но функция эта не виртуальная. Что, естессно, некорректно. Нужно перед функцией F в классе Parent дописать virtual.

Во-вторых, если явно не указан модификатор доступа ( private, protected или public ) для членов класса, по умолчанию подразумевается private, а потому функция F, объявленная в классе Parent, будет только в нём и видна. А, следовательно, от абстрактности этого класса никак не избавиться, ибо в дочерних классах она видна не будет. И функция F в дочернем классе не перегружает функцию F из класса Parent.

В-третьих при защищённом (protected) наследовании нельзя неявно преобразовывать указатель на объект класса-наследника в указатель на базовый класс.
3
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
20.11.2010, 09:01
Цитата Сообщение от NightmareZ Посмотреть сообщение
следовательно, от абстрактности этого класса никак не избавиться, ибо в дочерних классах она видна не будет
Это неверно. Сама функция видна не будет, но это и не требуется - ведь её всё равно переопределят. Более того, при переопределении можно и изменить её область видимости. Конечно, такой функцией всё равно нельзя будет пользоваться через указатель на базовый класс (ведь там она private), но в ряде случаев осмысленное использование закрытых чистых виртуальных функций вполне возможно и целесообразно.
0
Заблокирован
20.11.2010, 11:27
Цитата Сообщение от Nick Alte Посмотреть сообщение
Это неверно. Сама функция видна не будет, но это и не требуется - ведь её всё равно переопределят. Более того, при переопределении можно и изменить её область видимости. Конечно, такой функцией всё равно нельзя будет пользоваться через указатель на базовый класс (ведь там она private), но в ряде случаев осмысленное использование закрытых чистых виртуальных функций вполне возможно и целесообразно.
Блин, перегрузить и переопределить - две большие разницы.
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
20.11.2010, 12:51  [ТС]
Цитата Сообщение от NightmareZ Посмотреть сообщение
Во-первых, спецификатор чистой функции есть ( = 0 ), но функция эта не виртуальная. Что, естессно, некорректно. Нужно перед функцией F в классе Parent дописать virtual.

Во-вторых, если явно не указан модификатор доступа ( private, protected или public ) для членов класса, по умолчанию подразумевается private, а потому функция F, объявленная в классе Parent, будет только в нём и видна. А, следовательно, от абстрактности этого класса никак не избавиться, ибо в дочерних классах она видна не будет. И функция F в дочернем классе не перегружает функцию F из класса Parent.

В-третьих при защищённом (protected) наследовании нельзя неявно преобразовывать указатель на объект класса-наследника в указатель на базовый класс.
Теперь вопрос: почему при защищённом наследовании нельзя писать
C++
1
Parent *g = new Child
?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
20.11.2010, 14:30
Цитата Сообщение от alexsvk Посмотреть сообщение
Теперь вопрос: почему при защищённом наследовании нельзя писать
C++
1
Parent *g = new Child
?
Защищенное наследование делает все интерфейсные public-функции базового класса protected-функциями, т.е. недоступными пользователю.
Если при защищенном наследовании разрешить присванивание
C++
1
Parent *g = new Child;
то произойдет нарушение инкапсуляции, так как пользователь получит доступ к protected-функциям потомка, унаследованным от базового класса.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.11.2010, 14:30
Помогаю со студенческими работами здесь

Наследование
Реализовать наследование классов квартиры,этаж,подъезд,дом

Наследование
Как избавиться от неоднозначности при ромбовом наследовании?

наследование
Задача : Базовый класс: class Shape2D { public: Shape2D(); virtual ~ Shape2D(); virtual float Area( )= 0; virtual...

наследование
Люди, помогите пожалуйста....Не знаю как ее сделать... Описать базовый класс Строка. Обязательные поля класса: • поле для хранения...

наследование
Пытаюсь разобраться в наследовании Есть класс class File { public: struct comp { char num; // Имя переменной char st;...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru