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

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

02.02.2016, 17:53. Показов 3918. Ответов 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
03.02.2016, 11:29
Студворк — интернет-сервис помощи студентам
castaway,
не доступен != не наследуется.

Если ребёнок до 18 лет не имеет доступ к наследию родителей, то это не значит, что он не унаследовал их средства.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.02.2016, 11:30
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Буквы - то похожие на мне знакомые!
Слава богу. Я так на это рассчитывал! Делфи наследник Паскаля, если я правильно помню буквы. Поэтому говоря с дельфистом имеет смысл говорить о Паскале. Я его тоже не знаю. Именно поэтому и гораздо легче сказать что-нибудь.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
03.02.2016, 11:35
castaway, наследование стоит на ряду с инкапсуляцией и полиморфизмом - и "недоступен" ближе к инкапсуляции, чем к наследованию.

Уберите с данной формулы неизвестные от инкапсуляции и получим, что наследуется всё по определению ООП программирования. А то, что конструктор не наследуется - то это особености языка С++, и тут не поспоришь. Но менять фразу "наследуется всё" из-за 1-2 случаев для конкретного языка. Звучит же ж)
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.02.2016, 11:37
Unless redeclared in the derived class,
members of a base class are also considered to be members of the derived class. Members of a base class
other than constructors are said to be inherited by the derived class. Constructors of a base class can also
be inherited as described in 7.3.3. Inherited members can be referred to in expressions in the same manner
as other members of the derived class, unless their names are hidden or ambiguous (10.2).
rikimaru2013, а говорили стандарт это не оговаривает. А я вам и поверил...

Добавлено через 37 секунд
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А то, что конструктор не наследуется
Конструкторы могут наследоваться.
1
03.02.2016, 11:40

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Constructors of a base class can also be inherited as described in 7.3.3
Надо взять стандарт и Страуструпу им "по морде" со словами "кто это сделал?" :D. Недавно ж разбирали его цитату, что конструкторы не наследуются.

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
03.02.2016, 11:40
Цитата Сообщение от castaway Посмотреть сообщение
А я вам и поверил...
Да чего мне верить то - я только учу С++. И да там ссылку скидывал вам - там обсуждается что конструктор не наследуется: есть цитата с стандарта там и вывод, то что using A::A; заставит компилятор реализовать конструктор не означает, что конструкторы наследуются - если вы про это конечно же.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.02.2016, 11:44
Цитата Сообщение от Kastaneda Посмотреть сообщение
Недавно ж разбирали его цитату, что конструкторы не наследуются.
Может это была какая-то старая цитата? Ведь Inheriting constructors появились в C++11.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.02.2016, 11:48
Цитата Сообщение от castaway Посмотреть сообщение
Ведь Inheriting constructors появились в C++11
имеется ввиду делегирование конструкторов?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.02.2016, 11:48
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Да чего мне верить то - я только учу С++.
Мне кажется что сам Страуструп не знает его полностью. Век живи, век учить...

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
заставит компилятор реализовать конструктор не означает, что конструкторы наследуются
Я ту тему не читал, но раз уж мы полагаемся на стандарт, и придираемся к каждому слову, то согласно стандарту он всё же наследуются.

Добавлено через 19 секунд
Цитата Сообщение от Kastaneda Посмотреть сообщение
имеется ввиду делегирование конструкторов?
Есть делегирование, а есть наследование.
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.02.2016, 11:51
Цитата Сообщение от castaway Посмотреть сообщение
Есть делегирование, а есть наследование.
да, погуглил, я даже не знал об этом нововведении, теперь знаю, теперь мой код станет еще более непонятным для заказчика
0
03.02.2016, 11:53

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
я даже не знал об этом нововведении
Нововведению 5 лет исполнилось))

0
03.02.2016, 11:55

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Нововведению 5 лет исполнилось))
последнюю книгу по С++ я прочитал как раз лет 5 назад)) Сейчас правда до Мейерса все таки добрался, нужно в С++11/14 наконец-то разобраться.

0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.02.2016, 13:57
Цитата Сообщение от castaway Посмотреть сообщение
Но они недоступны, и, следовательно, не унаследованы
Не совсем не доступны:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Foo
{
private:
    virtual void f() { std::cout << "Foo" << std::endl; }
};
 
class Bar : public Foo
{
public:
    void someFunc() {
        // Bar::f() - Низзя Bar::f() - не унаследована?
    }
private:
    void f() override { std::cout << "Bar" << std::endl; } // Можно, Bar::f() - унаследована? (здесь Bar знает, что переоперделять)
};
0
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 518
03.02.2016, 14:27  [ТС]
Уг)) "накрутил" - сорри.
В общем "не отходя от кассы" - вопрос:
Можно ли в классе предке вызвать метод базового класса, находящегося в секции private?
Пример С++ (не работает):
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
private:
    void foo(){std::cout << "call method foo in class A" << std::endl;};
};
 
class B: public A
{
public:
    void foo(){ A::foo(); };
};
Delphi:
Delphi
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
27
28
29
30
31
type
  TBase = class // базовый
    private
      procedure foo; // метод базового класса
  end;
 
type
  TChildBase = class (TBase) // "наследник"
    public
      procedure foo; // вызов метода базового класса
  end;
 
{ TBase }
 
procedure TBase.foo;
begin
  ShowMessage('call method foo in class TBase'); // вывод сообщения
end;
 
{ TChildBase }
 
procedure TChildBase.foo;
begin
  inherited foo; // вызов метода базового класса
end;
 
...
// собственно создание
  ChildBase:= TChildBase.Create;
  ChildBase.foo;
// результат вывод окна с сообщением -> call method foo in class TBase
В общем можно ли достучаться до private секции базового/наследуемого класса в С++ ?
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.02.2016, 14:29
Цитата Сообщение от wendstor Посмотреть сообщение
В общем можно ли достучаться до private секции базового/наследуемого класса в С++ ?
Честным способом нет, но С++ все равно позволяет это сделать, правда тут ты уже сам себе злобный буратино.
2
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 518
03.02.2016, 14:35  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
Честным способом нет, но С++ все равно позволяет это сделать, правда тут ты уже сам себе злобный буратино.
А пример, ссылку?
Буду благодарен...
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
03.02.2016, 14:53
wendstor, вы не совсем понимаете. Дельфовый и плюсовый private не эквивалентны. Плюсовому в делфи соответствует strict private. Отсюда и разница в поведении.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.02.2016, 15:45
Цитата Сообщение от avgoor Посмотреть сообщение
Не совсем не доступны
Вот вы зачем мой пример коверкаете а потом говорите что я неправ в том что они недоступны?
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.02.2016, 16:08
Цитата Сообщение от wendstor Посмотреть сообщение
А пример
Меняем приватный член
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
27
28
29
30
31
#include <iostream>
 
class A
{
public:
    int get_x()
    {
        return x;
    }
  
private:
    int x = 123;
};
 
class B : public A
{
public:
    void set_private_x(int x)
    {
        *(int*)this = x;
    }
};
 
int main()
{
    B b;
    A *a = &b;
    std::cout << a->get_x() << std::endl;
    b.set_private_x(123456);
    std::cout << a->get_x() << std::endl;
}
но за такое руки отрывают (хотя в OpenJDK ооооочень много таких хаков, но там люди точно понимали, что делали).
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.02.2016, 16:21
Цитата Сообщение от castaway Посмотреть сообщение
Вот вы зачем мой пример коверкаете а потом говорите что я неправ в том что они недоступны?
Вот, допустим, Петя получил наследство от дедушки. Если у Пети нет прав (водительских), значит ли это, что он не унаследовал машину?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.02.2016, 16:21

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
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
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru