Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
22 / 22 / 8
Регистрация: 05.01.2012
Сообщений: 282
1

Как убрать функцию из дочернего класса?

22.03.2015, 20:06. Показов 3646. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Представим что имеется 3 класса: A, B и C;
Класс А - базовой(родительский). Класс В - наследуется от А. Класс С соответственно от В.
В родительском классе А имеется некая функция void fun1(). Естественно, что она присутствует в классах В и С.

Вопрос: как сделать так, что бы она была доступна в классе В, но ее не было в классе С.

Все до чего додумался - это объявил функцию как виртуальную, и в классе С переопределяю ее, делая пустой. В таком случаи при вызове она ничего не делает. Но как избавиться от нее вообще? Есть ли способ это сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2015, 20:06
Ответы с готовыми решениями:

Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса?
Ну то есть так: есть родительский и дочерний класс, в родительском определен виртуальная функция и...

Как построить экземпляр дочернего класса на основе готового экземпляра базового класса?
Если уже есть готовый объект базового класса. Могу я построить экземпляр дочернего на его основе,...

Как передать в метод класса Menu указатель на метод дочернего класса?
Как передать в метод базового класса указатель на метод дочернего: class Menu() { protected: ...

Как получить доступ в private из дочернего класса?
Привет :) Изучаю наследование. Столкнулся с такой проблемой. Написал класс "Figure" и создал...

8
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
22.03.2015, 20:24 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
protected:
void func1();
...
};
class B:private A // protected->private
{
...
};
class C:public B // func1 недоступна, т.к. в B она private
{
...
};
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.03.2015, 20:39 3
Цитата Сообщение от Gelo123321 Посмотреть сообщение
Вопрос: как сделать так, что бы она была доступна в классе В, но ее не было в классе С.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A
{
    friend class B;
    void foo(){}
};
 
class B: A
{
    void bar() { foo(); }
};
 
class C: public B
{
    void bar() 
    { 
        // --- доступ запрещен
        /*A::foo();*/
    }
};
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
22.03.2015, 21:04 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
public:
    void f() {}
};
 
class B : public A
{
};
 
class C : public B
{
    void f() = delete;
};
 
int main()
{
    B b;
    b.f();
    C c;
    //c.f(); // тут компиль ругнется
}
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.03.2015, 21:24 5
Цитата Сообщение от retmas Посмотреть сообщение
//c.f(); // тут компиль ругнется
так вроде же речь не за паблик интерфейс.
а насчет доступности функции-члена класса А в классе С:


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
class A
{
public:
    void f() {}
};
 
class B : public A
{
};
 
class C : public B
{
    void f() = delete;
public:   
    C()
    {
        A::f(); //<--- класс C имеет доступ к функциями A
    }
};
 
int main()
{
    B b;
    b.f();
    C c;
}
1
22 / 22 / 8
Регистрация: 05.01.2012
Сообщений: 282
22.03.2015, 23:46  [ТС] 6
hoggy, IntelliSense: удаленная функция переопределяет не удаленную функция "B::f"

Добавлено через 8 минут
zss, если сделать так, то функцию нельзя будет вызивать вне класса.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
22.03.2015, 23:50 7
Цитата Сообщение от Gelo123321 Посмотреть сообщение
А как ее убрать на совсем, что бы класс С даже не знал, что она существует?
пересмотреть идеологию
первое что приходит в голову, не самое лучшее
Цитата Сообщение от Gelo123321 Посмотреть сообщение
Класс А - базовой(родительский). Класс В - наследуется от А. Класс С соответственно от В.
и в классе А нет функции void fun1(). а есть она в классе, допустим, А1 который наследуется от А
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
23.03.2015, 00:05 8
Ну, еще можно в закрытую часть через using засунуть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A
{
public:
   void f() {}
};
 
class B : public A
{
};
 
class C : public B
{
private:
   using B::f;
};
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.03.2015, 09:29 9
Здесь явно проблема с архитектурой т.к. наследование - это не просто "сократить небольшую часть кода". Оно показывает связь классов. public наследование говорит о том, что класс предок является разновидностью базового и для него справедливо всё его поведение.

Я бы сделал класс A без "ненужного" метода, а от него бы ветвил уже детей.

Если что - модификаторами конечно можно запретить доступ, но метод в классе всё равно будет присутствовать.

Добавлено через 1 минуту
Для просвещения
0
23.03.2015, 09:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2015, 09:29
Помогаю со студенческими работами здесь

Как вызвать метод дочернего класса при приведении типов?
Привет у меня есть класс (Батя) и парочка дочерних классов в классе Батя есть метод void...

Может ли метод родительского класса обратиться к полю дочернего класса
Может ли метод родительского класса обратиться к полю дочернего класса?

Перегрузка оператора >> для дочернего класса от базового виртуального класса
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на...

Как из класса получить доступ к элементу дочернего окна главной формы?
Есть структура MDI - Главная форма-дочерняя. И есть класс. Из класса мне нужно получить данные о...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru