Можно ли определить / утверждать, что если одна виртуальная функция переопределяется, другая тоже переопределяется? - PullRequest
6 голосов
/ 13 января 2012

У меня есть существующий класс, который объявляет виртуальный метод и определяет реализацию по умолчанию.Теперь я хочу перегрузить этот метод другим параметром, а также дать реализацию по умолчанию.Кроме того, я хочу применить ограничение: если первый метод был переопределен подклассом , то второй (перегруженный) виртуальный метод также должен быть переопределен .это даже возможно внутри C ++?Если да, возможно ли это во время компиляции?

Пример кода:

class ParamA {};
class ParamB {};

class Base
{
public:
    virtual void method(ParamA a)
    {
        // default behavior
    }
    virtual void method(ParamB b)
    {
        // default behavior
    }
}

class Derived : public Base
{
public:
    virutal void method(ParamA)
    {
        // special behavior
    }
}

Моя цель - обнаружить классы типа Derived и заставить их реализовать свою версию method(ParamB b).

Ответы [ 4 ]

5 голосов
/ 13 января 2012

Нет, вы не можете указать сложные ограничения, для которых наборы функций-членов должны быть переопределены.Единственные ограничения применяются к отдельным функциям;чисто виртуальный (=0) для обязательного переопределения и (в C ++ 11) final для предотвращения переопределения.

Лучшее, что вы можете сделать, это сделать обе функции чисто виртуальными, заставляя производный класс переопределятьи то и другое.Это по крайней мере заставляет автора производного класса задуматься о том, что нужно переопределить;невозможно переопределить одну и забыть другую.

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

1 голос
/ 13 января 2012

Я думаю, что C ++ не предоставляет никаких средств для обнаружения такого отсутствующего переопределения в дочернем элементе.

@ larsmans: превращение обоих методов в чисто виртуальные приводит к отсутствию реализации по умолчанию.

@ js_:не могли бы вы рассказать немного о вашей актуальной проблеме?То, что вы ищете, кажется мне концептуально не очень ясным.

0 голосов
/ 13 января 2012

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

Конечно, вы могли бы ввести некоторые макросы (например, скажем OVERRIDE_METHODS ... Я уверен, что вы понимаете, о чем я говорю), но ничто не может помешать пользователям игнорировать их и переопределить только один из указанных методов.

Плюс такие макросы сделают код довольно уродливым.

0 голосов
/ 13 января 2012

Как насчет создания родительского класса, от которого Base будет наследоваться?Эти 2 функции будут чисто виртуальными в классе Parent.Производные классы будут наследовать Parent (а не Base) и должны будут реализовывать обе функции.

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