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

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

Войти
Регистрация
Восстановить пароль
 
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
#1

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

30.01.2014, 01:56. Просмотров 1391. Ответов 7
Метки нет (Все метки)

Добрый день! Скажите в чем разница между терминами замещение и переопределение?

Также хотел спросить, если в базовом классе 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;
    
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2014, 01:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В чем разница между терминами замещение и переопределение (C++):

В чем разница между X x; и X x()? - C++
Корректный ли этот ответ?

В чем разница между С и С++ - C++
Возник вопрос в чем жи разница между С и С++ кроме того, что в С++ есть классы а в С их нету ?

В чем разница между [] и * ? - C++
Думал, что ни в чем, но когда попытался сделать так: (в файле 1) char lc; в файле 2: extern char* lc; Компилятор ругаться не стал,...

В чем разница между malloc и new? - C++
в чем разница? что лучше использовать?

В чем разница между new и malloc()? - C++
Всем доброго дня ! Начал читать книгу Пахомов Б. &quot;C/C++ и MS Visual C++ 2008 для начинающих&quot; До этого прочитал С++ за 21 день. ...

В чем разница между f.read(),f.write() и f<<., f>>.? - C++
В чем разница между f.read(),f.write() и f&lt;&lt;..., f&gt;&gt;...?

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

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

Добавлено через 8 минут
Цитата по ссылке:
Цитата Сообщение от Mr.X Посмотреть сообщение
Эта терминология немного разнится в разных книжках, отчего у читателей в головах возникаех сумбур вместо музыки.
Существует три независимых понятия для функций:
• перегрузка;
сокрытие (как видим, в вышеприведенной цитате из Прата оно названо переопределением);
замещение виртуальной функции (в некоторых книгах также называется переопределением).
Т.е., и сокрытие, и замещение могут называться переопределением (в разных источниках, а может и в одном, как мой пример из Прата).
Раз в теме стоит вопрос о разнице между замещение и переопределение, то можно сделать вывод, что речь идёт о замещении и сокрытии (которое в вопросе названо переопределением).
1
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;
    
}
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, то компилятор видит этот код вполне корректным. А во время выполнения программы проверка на приватность уже не происходит и дальше в действие вступает стандартный механизм виртуальных функций
1
rvma
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 5
09.03.2015, 15:41 #8
Так в чем таки состоит разница между замещением и сокрытием метода? Сейчас я не говорю о виртуальности и т.д. Читаю наследование по Джессу Либерти. Напр., есть базовый класс, в котором есть публичная фун-я, тип возврата void, параметр приема - без парамеиров. Фун-я выводит в консоль "привет". Либерти пишет: "Если в наследованом классе прописать ту же фун-ю, с прототипом, как базовом, но изменить тело функции, прописать вивод в консоль не привет, "здравствуй", то в наследованом классе эта функция будет, переопределени или замещена. Если изменить прототип в наследованом классе, напр., принять инт в параметрах, в теле - здравствуй, то метод будет сокрыт." Выходит, в обоих случаях в наследованом классе доступа к методу в базовом уже не будет, наследованый будет выводить "здравствуй". Если будут перегруженные методы в базовом, то они так же будут скрыты, если переопределить в наследованом все и базового, то все в наследованом будут переопределены. Еще Либерти говорит, что сокрытие считается плохим тоном. И тут мне не ясно, так в чем тогда между ними разница, если в обоих случаях смысл остается тот же - для наследованого класса в обоих случаях методы будут вести себя одинаково, т.е. доступны, без явного вызова, из наследованого те, что прописаны в наследованом. Раз он об этом пишет, значит есть какая, то существенная разница. Помогите, пожалуйста, понять суть, философию, плиз)

Добавлено через 1 час 41 минуту
Что, никто не знает?
0
09.03.2015, 15:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2015, 15:41
Привет! Вот еще темы с ответами:

В чем разница между Debug and Release? - C++
Какие действия выполняет debug в Visual studio и какие Release, в чем разница? Никогда не задавался этим фундаментальным вопросом, что...

В чем разница между инициализацией и присваиванием? - C++
в чем разница между инициализацией и присваиванием? практически это одно и тоже,кроме инициализации ссылок-они могут менять значение.

В чем разница между scanf_s и scanf? - C++
какая разница между scanf_s и scanf?

В чем разница между Рекурсией и Итерацией? - C++
Рекурсия позволяет сэкономить время но требует больше памяти, а циклы длятся дольше рекурсии но при этом занимают меньше памяти? Я...


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

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

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