C ++ переопределяет конечные и чисто виртуальные методы - PullRequest
0 голосов
/ 16 марта 2012

Рассмотрим класс, который должен предлагать некоторые (полиморфные) методы, такие как арифметические или побитовые операторы для всех своих подклассов.Эти операции НЕ должны модифицироваться производными классами для обеспечения правильного выполнения.Однако в то же время я хотел бы, чтобы оценка подклассов (с функцией isError () в моем примере) определялась индивидуально:

class Mom
{
public:
    virtual bool operator && (const Mom&) const final
    {
        return this->isError() && p_rOther.isError();
    }
private:
    virtual bool isError() = 0;
};

Это, по-видимому, недопустимо, учитывая текущий стандарт, поскольку «чистая виртуальность» подразумевает необходимость для подклассов реализовывать все виртуальные функции базового класса, в то время как ключевое слово «final» противоречит этой парадигме.

Ответы [ 2 ]

5 голосов
/ 16 марта 2012

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

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

Полагаю, вы путаете это с тем фактом, что все Base станет абстрактным .


Фрагмент ниже в этом посте работает просто отлично, и приводит к поведению, которое вы описали. Несмотря на то, что функция virtual делает final своего рода побеждает ее цель.

Я бы порекомендовал вам удалить виртуальный спецификатор .

Это , если ваш Base не унаследован от базы, где присутствует функция virtual , и вы хотели бы прояснить это для будущих разработчиков, читающих ваш код.


#include <iostream>

struct Base {
  virtual bool operator&& (Base const& rhs) const final {
    std::cerr << "Base ::operator&& ()\n";

    return this->error () && rhs.error (); 
  }

  virtual bool error () const = 0;
};

struct Child : Base {
  virtual bool error () const {
    std::cerr << "Child::error ()\n";

    return true;
  }
};

int
main (int argc, char *argv[])
{

  Child ch1,   ch2;
  ;     ch1 && ch2;
}

выход

Base ::operator&& ()
Child::error ()
Child::error ()
2 голосов
/ 16 марта 2012

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

«чистая виртуальность» подразумевает необходимость для подклассов реализовать все виртуальные функции базового класса

Нет, чистая виртуальность требует, чтобы подкласс переопределял эту конкретную функцию.Не чистые функции не должны быть переопределены, и, конечно, не может быть, если объявлено final.

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