Форум программистов, компьютерный форум CyberForum.ru

В чем разница между терминами замещение и переопределение - C++

Восстановить пароль Регистрация
 
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
30.01.2014, 01:56     В чем разница между терминами замещение и переопределение #1
Добрый день! Скажите в чем разница между терминами замещение и переопределение?

Также хотел спросить, если в базовом классе Base метод foo() объявлен в разделе public, а его переопределенная/замещенная версия в производном классе Derived в разделе private, то при обращении к указателю на Base инициализированным указателем на Derrived, foo() можно вызвать как-будто он объявлен открытым.

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
class Base {
public:
    Base() { cout << "Base()\n"; }
    virtual void foo()  = 0 { cout << "Base::foo()\n"; }
    virtual void ~Base() = 0 { cout << "~Base()\n"; }
 
}; 
 
class Derived : public Base {
    void foo()  { cout << "Derived::foo()\n"; }
    ~Derived() { cout << "~Base()\n"; }
public:
    Derived() { cout << "Derived()\n"; }
 
};
 
int main (int argc, char ** argv)
{   
    Base* pB = new Derived;
    pB->foo();
    delete pB;
 
 return 0;
    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2014, 01:56     В чем разница между терминами замещение и переопределение
Посмотрите здесь:

В чем разница между random и randomize? C++
В чем разница между вектором и массивом C++
В чем разница между С и С++ C++
C++ В чем разница между X x; и X x()?
C++ В чем разница между [] и * ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alkenso
5 / 4 / 4
Регистрация: 30.01.2014
Сообщений: 27
30.01.2014, 02:25     В чем разница между терминами замещение и переопределение #2
Первое, на что хочу обратить внимание - для чисто виртуальных методов не стоит писать тело - ИМХО
Замещение - это если у Вас в базовом и производном классах есть виртуальная функция с идентичным прототипом, и в зависимости от значения, которым инициализирован указатель на базовый класс, вызывается соответствующая функция.
Переопределение(перегрузка) происходит в том случае, если в производном классе есть функция с аналогичным именем, но с другим прототипом (кол-во аргументов, например). Это будет уже ДРУГАЯ функция, которая к виртуальной, определенной в базовом классе отношения не имеет
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2014, 02:57     В чем разница между терминами замещение и переопределение #3
С этими терминами можно запутаться: Что такое переопределение функций
В одной и той же книге, под переопределением может подразумеваться и сокрытие, и замещение.

Добавлено через 9 минут
Например, у Прата. Первый абзац: переопределение, как сокрытие. Сразу, во втором абзаце: переопределение, как замещение.
Миниатюры
В чем разница между терминами замещение и переопределение   В чем разница между терминами замещение и переопределение  
Alkenso
5 / 4 / 4
Регистрация: 30.01.2014
Сообщений: 27
30.01.2014, 03:03     В чем разница между терминами замещение и переопределение #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Спутал термины, надо, по всей видимости, наоборот:
Переопределение- это если у Вас в базовом и производном классах есть виртуальная функция с идентичным прототипом, и в зависимости от значения, которым инициализирован указатель на базовый класс, вызывается соответствующая функция.
Замещение(перегрузка) происходит в том случае, если в производном классе есть функция с аналогичным именем, но с другим прототипом (кол-во аргументов, например). Это будет уже ДРУГАЯ функция, которая к виртуальной, определенной в базовом классе отношения не имеет
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2014, 03:13     В чем разница между терминами замещение и переопределение #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Alkenso Посмотреть сообщение
Спутал термины, надо, по всей видимости, наоборот:
Я думаю, вы все правильно написали.

Добавлено через 8 минут
Цитата по ссылке:
Цитата Сообщение от Mr.X Посмотреть сообщение
Эта терминология немного разнится в разных книжках, отчего у читателей в головах возникаех сумбур вместо музыки.
Существует три независимых понятия для функций:
• перегрузка;
сокрытие (как видим, в вышеприведенной цитате из Прата оно названо переопределением);
замещение виртуальной функции (в некоторых книгах также называется переопределением).
Т.е., и сокрытие, и замещение могут называться переопределением (в разных источниках, а может и в одном, как мой пример из Прата).
Раз в теме стоит вопрос о разнице между замещение и переопределение, то можно сделать вывод, что речь идёт о замещении и сокрытии (которое в вопросе названо переопределением).
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
30.01.2014, 04:18  [ТС]     В чем разница между терминами замещение и переопределение #6
Также хотел спросить, если в базовом классе Base метод foo() объявлен в разделе public, а его переопределенная/замещенная версия в производном классе Derived в разделе private, то при обращении к указателю на Base инициализированным указателем на Derrived, foo() можно вызвать как-будто он объявлен открытым - как называется это свойство, или следствием чего это являтся - нюанс работы мехнизма виртуальных функций?

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
class Base {
public:
    Base() { cout << "Base()\n"; }
    virtual void foo()  = 0 { cout << "Base::foo()\n"; }
    virtual void ~Base() = 0 { cout << "~Base()\n"; }
 
}; 
 
class Derived : public Base {
    void foo()  { cout << "Derived::foo()\n"; }
    ~Derived() { cout << "~Base()\n"; }
public:
    Derived() { cout << "Derived()\n"; }
 
};
 
int main (int argc, char ** argv)
{   
    Base* pB = new Derived;
    pB->foo();
    delete pB;
 
 return 0;
    
}
vovacreme
-16 / 61 / 13
Регистрация: 14.01.2014
Сообщений: 145
30.01.2014, 04:28     В чем разница между терминами замещение и переопределение #7
Цитата Сообщение от rcyn Посмотреть сообщение
Также хотел спросить, если в базовом классе Base метод foo() объявлен в разделе public, а его переопределенная/замещенная версия в производном классе Derived в разделе private, то при обращении к указателю на Base инициализированным указателем на Derrived, foo() можно вызвать как-будто он объявлен открытым - как называется это свойство, или следствием чего это являтся - нюанс работы мехнизма виртуальных функций?

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
class Base {
public:
    Base() { cout << "Base()\n"; }
    virtual void foo()  = 0 { cout << "Base::foo()\n"; }
    virtual void ~Base() = 0 { cout << "~Base()\n"; }
 
}; 
 
class Derived : public Base {
    void foo()  { cout << "Derived::foo()\n"; }
    ~Derived() { cout << "~Base()\n"; }
public:
    Derived() { cout << "Derived()\n"; }
 
};
 
int main (int argc, char ** argv)
{   
    Base* pB = new Derived;
    pB->foo();
    delete pB;
 
 return 0;
    
}
Этот механизм работает, потому что переменная pB объявлена, как указатель на Base,а поскольку метод Base::foo() у нас public, то компилятор видит этот код вполне корректным. А во время выполнения программы проверка на приватность уже не происходит и дальше в действие вступает стандартный механизм виртуальных функций
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2015, 15:41     В чем разница между терминами замещение и переопределение
Еще ссылки по теме:

В чем разница между заголовочными файлами и библиотеками C++
C++ В чем разница между push_back и push?
C++ В чем разница между инициализацией и присваиванием?

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

Или воспользуйтесь поиском по форуму:
rvma
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 5
09.03.2015, 15:41     В чем разница между терминами замещение и переопределение #8
Так в чем таки состоит разница между замещением и сокрытием метода? Сейчас я не говорю о виртуальности и т.д. Читаю наследование по Джессу Либерти. Напр., есть базовый класс, в котором есть публичная фун-я, тип возврата void, параметр приема - без парамеиров. Фун-я выводит в консоль "привет". Либерти пишет: "Если в наследованом классе прописать ту же фун-ю, с прототипом, как базовом, но изменить тело функции, прописать вивод в консоль не привет, "здравствуй", то в наследованом классе эта функция будет, переопределени или замещена. Если изменить прототип в наследованом классе, напр., принять инт в параметрах, в теле - здравствуй, то метод будет сокрыт." Выходит, в обоих случаях в наследованом классе доступа к методу в базовом уже не будет, наследованый будет выводить "здравствуй". Если будут перегруженные методы в базовом, то они так же будут скрыты, если переопределить в наследованом все и базового, то все в наследованом будут переопределены. Еще Либерти говорит, что сокрытие считается плохим тоном. И тут мне не ясно, так в чем тогда между ними разница, если в обоих случаях смысл остается тот же - для наследованого класса в обоих случаях методы будут вести себя одинаково, т.е. доступны, без явного вызова, из наследованого те, что прописаны в наследованом. Раз он об этом пишет, значит есть какая, то существенная разница. Помогите, пожалуйста, понять суть, философию, плиз)

Добавлено через 1 час 41 минуту
Что, никто не знает?
Yandex
Объявления
09.03.2015, 15:41     В чем разница между терминами замещение и переопределение
Ответ Создать тему
Опции темы

Текущее время: 16:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru