Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 518

Есть ли механизмы наследования в C++ как в Delphi?

02.02.2016, 17:53. Показов 3920. Ответов 82
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Я Delphi'ст. И интересует следующий вопрос. А именно в чём различие методов классов abstract от virual в плане наследования?
Приведу пример на delphi:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type
  TBaseClass = class
   public
     procedure BlaBla(); virtual;
  end;
 
  TNextClas = class (TBaseClass) // наследование от базового класса
    public
     // procedure BlaBla(); virtual; // наследуется от базового (копия) и может перекрыт при наследовании
  end;
 
  TNextClas2 = class (TNextClas) // наследование класса
    public
     // procedure BlaBla(); virtual; // та же петрушка) но от TNextClas
  end;
В данном случае, при наследовании классов метод BlaBla основного класса (TBaseClass) будет унаследован другими классами (предками), без явного их описания, т.е. скопирован. При этом если описать метод BlaBla() следующем образом (является медленным):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type
  TBaseClass = class
   public
     procedure BlaBla(); dynamic;
  end;
 
  TNextClas = class (TBaseClass) // наследование от базового класса
    public
     // procedure BlaBla(); dynamic; // ссылается на базовый класс, и не копируется
  end;
 
  TNextClas2 = class (TNextClas) // наследование класса
    public
     // procedure BlaBla(); dynamic; // та же петрушка) Ссылается на метод BlaBla() класса TBaseClass
  end;
Т.е. во втором случае BlaBla() метод не копируется классами предками, а только ссылается на метод базового класса.
В общем как обстаят дела у с++ при наследовании классов?
Заранее благодарю...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.02.2016, 17:53
Ответы с готовыми решениями:

Как правильно использовать механизмы наследования и полиморфизма для создания единого интерфейса
Доброго времени суток Комрады! Я невкурю тему про полиморфную обработку или как кошерно_правильно и рассово_верно использовать механизмы...

Разработать и реализовать иерархию классов, используя механизмы наследования
Добрый день, помогите, пожалуйста! очень нужна помощь! Необходимо разработать и реализовать иерархию классов для описанных объектов...

Какие есть механизмы идентификации, аутентификации и авторизации?
Здравствуйте! Ни кто не знает материала про систему идентификации, аутентификации и авторизации в Linux? Как работает, каков механизм,...

82
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
02.02.2016, 23:32
Студворк — интернет-сервис помощи студентам
castaway, там Mr.X сказал правильную вещь - пока такие неточности и пробелы в базовых понятиях - будет путаница всегда - любой договор в начале ставят точки над определениями. В С++ поставили точки над 70% понятиями, а те 30% гуляют...

Добавлено через 2 минуты
Цитата Сообщение от castaway Посмотреть сообщение
если в примере из 12-го сообщения наследнику недоступен метод базового класса?
Наследуется же ж http://rextester.com/GOCRI54305

Если нету в паблик интерфейсе класса - значит не наследуется? Получается надо определение что такое наследование иначе как понять, что это за фрукт
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.02.2016, 23:34
rikimaru2013, ну тогда не будем устраивать холивар. Пусть каждый останется при своём мнении...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.02.2016, 23:35
Цитата Сообщение от castaway Посмотреть сообщение
наследнику недоступен метод базового класса?
"недоступность" не означает "не существование".

Цитата Сообщение от castaway Посмотреть сообщение
Я в это верю, но я этого не вижу.
разве не очевидно, что если б наследник не наследовал все методы и члены базового класса,
то базовый подобъект его собственного агрегата не смог бы функционировать?
2
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.02.2016, 23:38
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Наследуется же ж
Наследуется, если изменить код. Вы зачем его изменили?

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
"недоступность" не означает "не существование".
"не существование" не означает "не наследование".

Цитата Сообщение от hoggy Посмотреть сообщение
разве не очевидно, что если б наследник не наследовал все методы и члены базового класса,
то базовый подобъект его собственного агрегата не смог бы функционировать?
А что вы понимаете под наследованием? Существование? Да, они существуют. Но они недоступны, и, следовательно, не унаследованы. Я так считаю.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.02.2016, 23:57
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
есть прикольный пост про "если класс Б является классом А по определению понятий "наследование" и "композиция", то как так получилось, что класс Б не может, что всё может А - если Б и есть подмножеством А.
лучше спросите, как вообще такой наследник сможет функционировать.

Добавлено через 13 минут
Цитата Сообщение от castaway Посмотреть сообщение
"не существование" не означает "не наследование".
означает.
нельзя унаследовать то, чего не существует.

нельзя полагать унаследованным нечто,
если нечто не существует.

Цитата Сообщение от castaway Посмотреть сообщение
А что вы понимаете под наследованием?
для того, что бы понять мою точку зрения,
вам сначала нужно ответить на вопрос:

в чем принципиальное различие следующих двух конструкций, с технической точки зрения?
(классы не подлежат модификации.

C++
1
2
3
4
5
6
7
8
9
10
11
struct base
{
    base_method() {}
    int base_data;
};
 
struct der: base
{
    der_method() {}
    int der_data;
};
и

C++
1
2
3
4
5
6
7
8
struct agregat
{
    base_method() {}
    der_method() {}
 
    int base_data;
    int der_data;
};
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.02.2016, 00:06
Цитата Сообщение от hoggy Посмотреть сообщение
означает
Согласен. Ответил опрометчиво.

Цитата Сообщение от hoggy Посмотреть сообщение
для того, что бы понять мою точку зрения, ...
У меня нет никакого желания разгадывать ваши шарады. Свою точку зрения я высказал. Если хотите опровергнуть - just do it.
Да и агрегаты, насколько мне известно, не имеют пользовательских конструкторов. Хотя из вашего примера не понятно, конструкторы это, или нет...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.02.2016, 00:11
castaway, я не особо искушен, но согласен с hoggy, - видимость и доступность не одно и то же. Можно и в базовом классе не иметь доступа к методу. Класс наследник может не иметь доступа даже к открытым методам базового класса в качестве своих доступных (интерфейсных) методов, но это не значит что он их не видит. При private наследовании он может их использовать своими методами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
class A
{
    void foo(){cout<<"A"<<endl;}
public:
void call_Afoo(){foo();}
};
class B: public A
{
public:
void call_Bfoo(){call_Afoo();}
};
 
void main()
{
A a;
//a.foo();//A видит свой член, но error C2248: A::foo: невозможно обратиться к private член, объявленному в классе "A"
a.call_Afoo();//ok
 
B b;
//b.foo();//b видит  свой член (он - класс А), но error C2248: A::foo: невозможно обратиться к private член, объявленному в классе "A"
b.call_Bfoo();
b.call_Afoo();//при public наследовании доступен и член Afoo()
    getchar();
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.02.2016, 00:19
IGPIGP, я привёл простой пример. В нём наследник не видит метод базы. По-вашему это наследование? По-моему - нет.

Цитата Сообщение от IGPIGP Посмотреть сообщение
При private наследовании он может их использовать своими методами.
А я говорил что не может?

Добавлено через 51 секунду
Кстати, я не вижу в вашем примере private наследования.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.02.2016, 01:14
Цитата Сообщение от castaway Посмотреть сообщение
Кстати, я не вижу в вашем примере private наследования.
В Одессе любят приём который Вы используете,- А я разве говорил, что он есть в моём примере?
Цитата Сообщение от castaway Посмотреть сообщение
А я говорил что не может?
Фактически, утверждая, что он не наследуется, да, говорили.
0
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 518
03.02.2016, 01:16  [ТС]
Пусть наследуется но в каком виде? VMT - нет... Или ошибаюсь?
Цитата Сообщение от hoggy Посмотреть сообщение
в чем принципиальное различие следующих двух конструкций, с технической точки зрения?
(классы не подлежат модификации.
agregat - использует конструкторы и методы наследников (ссылки) + инициализация адреса на опред. тип данных
Тогда что пойдёт (из методов) в agregat ?
Думаю, что не чего... при условии, что метод явно не будет указан или перекрыт. Но и даже в этом виде будет ссылка на метод предка. (пока не могу проверить, т.к. нет под рукой с++ и hex)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.02.2016, 01:24
Цитата Сообщение от castaway Посмотреть сообщение
В нём наследник не видит метод базы. По-вашему это наследование
Это по мнению, больших дядь, я только повторяю услышанное. Между наследником и базовым классом сложные имущественные отношения. Если класс сам от себя защищается гильотиной: private, то от наследника первой степени родства есть ещё одна ступень. От остальных - всё одно гильотина.
Бедные родственники.
Однако, к старости у всех характер не мёд. И что теперь? Считать папу старой сво... ну то есть по кускам воспринимать? Не-ет. Папа есть и он есть це-ли-ком. Так говорят.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.02.2016, 01:30
Цитата Сообщение от wendstor Посмотреть сообщение
agregat - использует конструкторы и методы наследников (ссылки)
Цитата Сообщение от wendstor Посмотреть сообщение
даже в этом виде будет ссылка на метод предка.
либо речь не о с++, либо это какой то бред.
0
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 518
03.02.2016, 01:46  [ТС]
hoggyТ.е. Вы хотите сказать что в классе agregat будут продублированы методы(в данном случае конструкторы), вместо того что можно просто дать ссылку на адрес(а) метода(ов)?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.02.2016, 09:20
Цитата Сообщение от wendstor Посмотреть сообщение
вместо того что можно просто дать ссылку на адрес(а) метода(ов)?
откуда вы взяли весь этот бред про ссылки на методы?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
03.02.2016, 10:13
wendstor, делфист хочет доказать плюсовику, что наследование это обретение ссылок на методы наследником от родителя?
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
03.02.2016, 10:25
Цитата Сообщение от castaway Посмотреть сообщение
В данном примере функция-член foo() класса A не наследуется.
Наследуется, просто доступа к ней нет.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.02.2016, 10:41
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
обретение ссылок на методы наследником от родителя
А у родителя разве не ссылки? Или в Паскале методы лежат в классе на полках? Накрахмаленные и отутюженные.
Дык если в терминах шифоньера, то наследник, это шифоньер в котором базовый класс, - секция/раздел.
Просто некоторые отделения базового могут не открываться.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
03.02.2016, 10:44
IGPIGP, буквы! Буквы - то похожие на мне знакомые! Но, что вы написали не понятно))) да и фраза "а в паскале" подразумивает, что я должен знать этот язык?) Нет.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
03.02.2016, 11:06
Цитата Сообщение от castaway Посмотреть сообщение
В нём наследник не видит метод базы. По-вашему это наследование?
Видит. Если б не видел, компилятор бы выдал ошибку типа "'foo()' was not declared in this scope". Но этого не происходит, и компилятор говорит, "void A::foo() is private", а значит видит, но не может достучаться.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.02.2016, 11:20
Kerry_Jr, не надо придираться к словам. Суть мысли была в том что он есть, но он не доступен. Поэтому формально он не наследуется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.02.2016, 11:20

Программирование системы подсказок - есть ли стандартные механизмы?
Требуется сделать систему помощи программы. Есть ли встроенные средства в .NET(c#)? Спасибо за любой совет или подсказку.

Какие механизмы для защиты кучи есть?
Необходимо отключить механизмы защиты от переполнения кучи стоит windows 8.1 vs 12 -13 при необходимости готов менять операционку

Есть ли в Oracle механизмы работы с очень большими объемами данных ?
Проблема такая: Есть база, которой пользуемся уже 4 года, структура базы такова, что есть несколько быстро растущих таблиц связанных с...

Есть исходник DLL на Delphi как (и возможно ли) написать похожее на VB.NET и использовать в среде программы написанной на Delphi
Суть вопроса вкратце такова - Есть исходник DLL написанной на Delphi Library Extdll; uses SysUtils, Windows; type ...

Распределённые системы. Как именно реализовываются механизмы масштабируемости?
Пишу простую распределённую систему. Её задача - связать каждый узел с каждым гарантированно за конечное время в том смысле, что, взяв...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru