Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2019, 15:44   #1
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию Возможно ли такое наследование?

Есть некий класс, назовём его A. A имеет некие члены. Я хочу создать другой класс, назовём его B. B должен быть потомком A, но отличаться только тем, что в нём должна быть запревачена часть, но не все члены, которые в A специфицированы как public. Никаких новых членов в B быть не должно. Например:
Код:
class A
{
 private:
  int a;
  int b;
  void m1();
  void m2();
  void m3();
 public:
  void m4();
  void m5();
  void m6();
};
, B должен иметь те же 8 членов, но B::a, B::b, B::m1, B::m2, B::m3 и B::m4 должна быть private, а B::m5 и B::m6 – public. Возможно ли это вообще? Надо ли заново писать реализацию каждого члена, чьи спецификации доступа различаются? Или достаточно заново их декларировать?

Последний раз редактировалось taras-proger77; 25.04.2019 в 15:53.
taras-proger77 вне форума Ответить с цитированием
Старый 25.04.2019, 19:52   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Код:
class B : public A
{
};
И все...
waleri вне форума Ответить с цитированием
Старый 29.04.2019, 09:53   #3
ffh2000
 
Регистрация: 20.09.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Код:
class B : public A
{
};
И все...
Не совсем верно...
Приватные члены родителя в потомке не доступны, поэтому a, b, m1(), m2(), m3() надо писать свои т.к. их формально в class B нет
Код:
class B : public A
{
 private:
  int a;
  int b;
  void m1();
  void m2();
  void m3();
};
ffh2000 вне форума Ответить с цитированием
Старый 04.05.2019, 17:38   #4
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
И все...
Вы хоть отличие читали?
taras-proger77 вне форума Ответить с цитированием
Старый 04.05.2019, 17:45   #5
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от ffh2000 Посмотреть сообщение
надо писать свои т.к. их формально в class B нет
И заново декларировать все поля (члены-данные)? А потом не окажется, что это другие поля? То есть
Код:
A a;
B *p=((B*)(&a));
, потом я что-то делаю с полями через методы (функции-челены) p, а на полях a это не отразится?

Последний раз редактировалось taras-proger77; 04.05.2019 в 17:48.
taras-proger77 вне форума Ответить с цитированием
Старый 11.05.2019, 21:45   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Возможно ли это вообще? Надо ли заново писать реализацию каждого члена, чьи спецификации доступа различаются? Или достаточно заново их декларировать?
волшебное ключевое слово using
позволяет наследнику изменить модификатор доступа
существующего метода базового класса.


Код:
class A
{
 private:
  int a;
  int b;
    void m1(){}
    void m2(){}
    void m3(){}
 public:
    A(): a(), b(){}
    
    void m4(){}
    void m5(){}
    void m6(){}
};

class B : public A
{
    using A::m4;  // <--- публичный метод класс A теперь будет приватным для класса B
public:
    B(){}
};

int main()
{
    B b;
    
    b.m5();
}
_Bers вне форума Ответить с цитированием
Старый 13.05.2019, 18:22   #7
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
волшебное ключевое слово using
Шилдт утверждает, что оно для пространств имён.
taras-proger77 вне форума Ответить с цитированием
Старый 13.05.2019, 19:01   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И? Зачем он вам? Он не писал про новые стандарты.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.05.2019, 19:09   #9
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Протестил. Никаких преимуществ пред
Код:
void m()
{
 A::m();
}
, или
Код:
void m()
{
 return A::m();
}
, только недостаток: если метод имеет однотипные параметры, которые надо поменять местами, то юзин не справится, а по-старому можно. Более того, юзин не справляется, даже если метод перегружен в предке и надо поменять доступ только для одной версии. Например,
Код:
class A
{
 ...
 publc
 void m(int x)
 {
  ...
 }
  void m(double x)
 {
 }
};
class B
{
 private:
  m (int x)
 {
  A::m(x);
 }
}
(имя совпадает, но версию для дабла надо оставить public) юзином не заменишь.

Последний раз редактировалось taras-proger77; 13.05.2019 в 19:16.
taras-proger77 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли такое в textBox stu_dent C# (си шарп) 7 21.03.2018 19:44
Наследование от другого события. Возможно ли? Delphi_ProGer Общие вопросы Delphi 7 09.04.2013 19:47
Возможно ли такое? Vlad.V Microsoft Office Excel 28 13.01.2011 18:51
Возможно реализовать такое Devourer12345 Microsoft Office Access 10 15.08.2008 08:08