С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Обращение к методам базового класса (есть ли подобие base/super?) - C++

28.12.2013, 11:49. Просмотров 936. Ответов 12
Метки нет (Все метки)

Понятное дело, что можно обращаться к методам базового класса так: BaseClass::hisMethod();
Однако это зависимость от названия класса. Не очень это как-то. В C# есть слово base, в Java super. Есть ли подобие в C++? И как обращаться к базовому без применения его имени?

Не по теме:

Раньше об этом не задумывался, пока не начал производить рефакторинг кода и, было решено, переименовать класс после соединения нескольких в один. Связи остались те же (второй класс был легким, но функциональным). В итоге поубивал всё, через ctrl+F и полдня пролазил с ручным измением..

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2013, 11:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обращение к методам базового класса (есть ли подобие base/super?) (C++):

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Обращение к методам класса через указатель на экземпляр класса - C++
Добрый день. Не могу осилить проблему: Описан абстрактный класс. Описаны наследники этого класса уже без абстрактности. Описан...

Обращение к полям и методам класса через объект - C++
есть класс TEditor (методы класса обязательно должны создавать новый объект и возвращать его, до сих пор не могу понять зачем - требование...

Callback std::function + доступ к приватным полям класса методам которые не есть их полями - C++
Проблема, товарищи. В прикрепленном архиве 3 файла, из которых состоит моя программа: **main.cpp; prototypes.h; realization.cpp** 1....

Создание указателя типа базового класса на экземпляр производного класса - C++
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

Указатель на объект базового класса и адрес объекта производного класса - C++
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

12
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.12.2013, 12:22 #2
Цитата Сообщение от nexen Посмотреть сообщение
В C# есть слово base, в Java super. Есть ли подобие в C++?
нет

Цитата Сообщение от nexen Посмотреть сообщение
Однако это зависимость от названия класса.
для этого в классе делают
C++
1
typedef BaseClass1 Parent;
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.12.2013, 12:40  [ТС] #3
Jupiter,
Цитата Сообщение от Jupiter Посмотреть сообщение
typedef BaseClass1 Parent;
всё равно зависит от имени, хоть теперь и локализовано в одном месте
Спасибо
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
28.12.2013, 16:42 #4
nexen, для переименования сущностей в некоторых средах (QtCreator например) как раз есть механизм из разряда "рефакторинг". Чтобы не возиться с ручным поиск-замена.
В шарпах и джаве нет множественного наследования, поэтому и базовый класс там один. В плюсах может быть несколько.
1
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
28.12.2013, 18:38 #5
nexen, да и вообще желательно избегать переопределения "непереопределяемых" (без спец. virtual) методов. Возможно стоит пересмотреть структуру вашей иерархии.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.12.2013, 19:37  [ТС] #6
gromo, nope. Вызывать методы базового класса мне необходимо для того, чтобы вызвать его часть работы. Один из паттернов проектирования.
0
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
28.12.2013, 21:23 #7
Цитата Сообщение от nexen Посмотреть сообщение
Вызывать методы базового класса мне необходимо для того, чтобы вызвать его часть работы. Один из паттернов проектирования.
так я и не говорю, что методы базового класса не нужно вызывать. Только вот если вы не будете переопределять в производном классе методы базового класса без virtual-спецификатора, то у вас и не возникнет неоднозначности, из-за которой вы создали эту тему.
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.12.2013, 23:01 #8
Цитата Сообщение от gromo Посмотреть сообщение
Только вот если вы не будете переопределять в производном классе методы базового класса без virtual-спецификатора, то у вас и не возникнет неоднозначности, из-за которой вы создали эту тему.
gromo,
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
#include <iostream>
 
class Foo
{
public:
    virtual void print() const
    {
        std::cout << "foo\n";
    }
};
 
class Bar : public Foo
{
public:
    void print() const
    {
        Foo::print();
        std::cout << "bar\n";
    }
};
 
int main() 
{
    Bar b;
    Foo& f = b;
    f.print();
    return 0;
}
1
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
28.12.2013, 23:56 #9
Цитата Сообщение от Jupiter Посмотреть сообщение
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
#include <iostream>
class Foo
{
public:
 virtual void print() const
 {
 std::cout << "foo\n";
}
};
class Bar : public Foo
{
public:
 void print() const
{
 Foo::print();
 std::cout << "bar\n";
}
};
int main() 
{
 Bar b;
 Foo& f = b;
 f.print();
 return 0;
}
Я понимаю, что в производном классе явно указывать virtual не обязательно, если вы об этом.
У ТС вопрос стоял так
Цитата Сообщение от nexen Посмотреть сообщение
И как обращаться к базовому без применения его имени?
Потребность обращения к функциям-членам базового класса из производного по его (базового класса) имени возникает тогда, когда в производном переопределена невиртуальная функция базового класса.
Я же выше писал, что
Цитата Сообщение от gromo Посмотреть сообщение
если вы не будете переопределять в производном классе методы базового класса без virtual-спецификатора, то у вас и не возникнет неоднозначности, из-за которой вы создали эту тему.
То есть из-за того, что ТС переопределил такую, концептуально с точки зрения С++, "непереопределяемую" функцию, у него и возникла необходимость в поиске альтернатив base из С# ил super из Java.
Поправьте, если я не прав.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.12.2013, 00:26 #10
производный класс переопределил виртуальную функцию. и в этой переоределенной
потребовался функционал из базового. и вот чтобы вызвать функцию базового,
нужно указать явно, что зовется именно она: Base::SomeFunction (иначе рекурсивный вызов самой себя).
В случае с невиртуальными функциями имеем дело с сокрытием имен. Тут тоже требуется явное указание,
где ее искать, иначе либо ошибка компиляции из-за несоответствия агрументов в найденных функциях-кандидатах, либо будет вызов не той функции.
1
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.12.2013, 00:32 #11
Цитата Сообщение от gromo Посмотреть сообщение
Потребность обращения к функциям-членам базового класса из производного по его (базового класса) имени возникает тогда, когда в производном переопределена невиртуальная функция базового класса.
с чего ты взял что она не виртуальная?

Цитата Сообщение от gromo Посмотреть сообщение
Поправьте, если я не прав.
не прав. суть проблемы в том чтобы в реализации производного класса вызвать реализацию базового класса.
виртуальна ли при этом функция или нет - дело десятое.
да нехорошо переопределять не виртуальные функции - но проблема не в этом.
1
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
29.12.2013, 01:21 #12
Цитата Сообщение от DU Посмотреть сообщение
производный класс переопределил виртуальную функцию. и в этой переоределенной
потребовался функционал из базового
Это уж извините меня... Зачем нам функционал базового класса в таком случае? Мы функцию сделали виртуальной, потому что её поведение в производном классе должно отличаться от базового.
В противном случае и виртуализация не нужна...

Добавлено через 3 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
суть проблемы в том чтобы в реализации производного класса вызвать реализацию базового класса.
виртуальна ли при этом функция или нет - дело десятое.
Может быть и так.
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.12.2013, 01:34 #13
Это уж извините меня... Зачем нам функционал базового класса в таком случае?
тайна личности требование бизнес-логики
2
29.12.2013, 01:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2013, 01:34
Привет! Вот еще темы с ответами:

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

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса - C++
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей на базовый абстрактный класс,...

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

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса - C++
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B и obj_B = obj_A? Добавлено через 9...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.