Как зайти в Даркнет?!
25th January, 01:11
4
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4380
0
Помогите пожалуйста решить задачи
24th November, 23:53
6084
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4308
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Есть ли способ предотвратить переопределение метода в подклассах?
Кто-нибудь знает о языковой функции или технике в C++, чтобы предотвратить чрезмерное использование дочерним классом определенного метода в родительском классе?
class Base {
public:
bool someGuaranteedResult() { return true; }
};
class Child : public Base {
public:
bool someGuaranteedResult() { return false; /* Haha I broke things! */ }
};
Даже если он не является виртуальным, это все равно разрешено (по крайней мере, в компиляторе Metrowerks, который я использую), все, что вы получаете, - это предупреждение о времени компиляции о скрытии невиртуальной наследуемой функции X.
Когда вы можете использовать спецификатор final для виртуальных методов (введенный с C++11), вы можете это сделать. Позвольте мне процитировать мой любимый сайт doc :
При использовании в объявлении виртуальной функции final указывает, что функция не может быть переопределена производными классами.
Адаптированный к вашему примеру это было бы похоже:
class Base {
public:
virtual bool someGuaranteedResult() final { return true; }
};
class Child : public Base {
public:
bool someGuaranteedResult() { return false; /* Haha I broke things! */ }
};
При компиляции:
$ g++ test.cc -std=c++11
test.cc:8:10: error: virtual function ‘virtual bool Child::someGuaranteedResult()’
test.cc:3:18: error: overriding final function ‘virtual bool Base::someGuaranteedResult()’
Когда вы работаете с компилятором Microsoft, также обратите внимание на ключевое слово sealed.
Есть пара идей:
- Сделайте свою функцию приватной.
- Не делайте свою функцию виртуальной. Однако это на самом деле не мешает функции быть затененной другим определением.
Кроме этого, я не знаю языковой функции, которая будет блокировать вашу функцию таким образом, чтобы она не была перегружена и все еще могла быть вызвана через указатель/ссылку на дочерний класс.
Удачи вам!
Похоже, что вы ищете эквивалент ключевого слова Java языка final , которое предотвращает переопределение метода подклассом .
Как и другие здесь предположили, вы действительно не можете предотвратить это. Кроме того, кажется, что это довольно часто задаваемый вопрос .
Для пояснения скажу, что большинство из вас неправильно поняли его вопрос. Он не спрашивает о методе "overriding", он спрашивает, Есть ли способ предотвратить "hiding" или нет. И самый простой ответ - это "there is none!".
Вот его пример еще раз
Родительский класс определяет функцию:
int foo() { return 1; }
Дочерний класс, наследующий Родительский, определяет ту же функцию AGAIN (не переопределяя):
int foo() { return 2; }
Это можно сделать на всех языках программирования. Ничто не мешает этому коду компилироваться (кроме установки на компиляторе). Лучшее, что вы получите, - это предупреждение о том, что вы скрываете метод родителя. Если вы вызовете дочерний класс и вызовете метод foo, вы получите 2. Вы практически нарушили этот код.
Вот о чем он спрашивает.
(a) я не думаю, что сделать функцию частной-это решение, потому что это просто скроет функцию базового класса от производного класса. Производный класс всегда может определить новую функцию с той же сигнатурой. (b) сделать функцию невиртуальной также не является полным решением, поскольку , если производный класс переопределяет ту же самую функцию, всегда можно вызвать производную функцию класса путем привязки времени компиляции, т. е. obj.someFunction(), где obj является экземпляром производного класса.
Я не думаю, что есть способ сделать this.Also,i хотел бы знать причину вашего решения запретить производным классам переопределять функции базового класса.
Я догадываюсь, что компилятор предупреждает Вас о том, что скрывается !! Действительно ли он отменяется ?
компилятор может выдать вам предупреждение, но во время выполнения метод родительского класса будет вызван, если указатель имеет тип родительского класса, независимо от фактического типа объекта, на который он указывает.
Это очень интересно. Попробуйте сделать небольшую автономную тестовую программу для вашего компилятора.
Я искал то же самое и вчера пришел к этому [довольно старому] вопросу.
Сегодня я нашел аккуратное ключевое слово c++11 : final . Я подумал, что это может быть полезно для следующих читателей.
http://en.cppreference.com/w/cpp/language/final
Попытка запретить кому-либо использовать то же имя, что и ваша функция в подклассе, мало чем отличается от попытки запретить кому-либо использовать то же глобальное имя функции, которое вы объявили в связанной библиотеке.
Вы можете только надеяться, что пользователи, которые намереваются использовать ваш код, а не чужой, будут осторожны с тем, как они ссылаются на ваш код, и что они используют правильный тип указателя или используют полную область видимости.
В вашем примере ни одна функция не переопределяется. Вместо этого он скрыт (это своего рода вырожденный случай перегрузки). Ошибка находится в коде дочернего класса. Как и предлагал csmba, все, что вы можете сделать, это изменить настройки компилятора (если это возможно) ; это должно быть нормально, если вы не используете стороннюю библиотеку, которая скрывает свои собственные функции.