Есть ли способ предотвратить переопределение метода в подклассах? - PullRequest
27 голосов
/ 20 августа 2008

Кто-нибудь знает какую-либо языковую функцию или технику в C ++, чтобы запретить дочернему классу перегружать определенный метод в родительском классе?

class Base {
public:
    bool someGuaranteedResult() { return true; }
};

class Child : public Base {
public:
    bool someGuaranteedResult() { return false; /* Haha I broke things! */ }
};

Несмотря на то, что это не виртуально, это все же разрешено (по крайней мере, в используемом мной компиляторе Metrowerks), все, что вы получаете, это предупреждение во время компиляции о скрытии не виртуальной унаследованной функции X.

Ответы [ 14 ]

0 голосов
/ 21 августа 2008

Попытка запретить кому-либо использовать то же имя, что и ваша функция в подклассе, мало чем отличается от попытки запретить кому-либо использовать то же глобальное имя функции, которое вы объявили в связанной библиотеке.

Вы можете только надеяться, что пользователи, которые хотят использовать ваш код, а не чужие, будут осторожны с тем, как они ссылаются на ваш код и что они используют правильный тип указателя или используют полностью определенную область.

0 голосов
/ 20 августа 2008

Пока вы не сделаете метод виртуальным, дочерний класс не сможет его переопределить. Если вы хотите, чтобы дочерние классы не вызывали его, сделайте его закрытым.

Так что по умолчанию C ++ делает то, что вы хотите.

0 голосов
/ 20 августа 2008

Методы C ++ являются закрытыми и не могут быть переопределены по умолчанию.

  • Вы не можете переопределить приватный метод
  • Вы не можете переопределить не- virtual метод

Возможно, вы имеете в виду перегрузку?

0 голосов
/ 20 августа 2008

Если вы обращаетесь к дочернему классу как к типу его родителя, то не виртуальная функция вызовет версию родительского класса.

е:

Parent* obj = new Child();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...