2012-03-16 4 views
-1

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

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

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

Любые предложения или идеи, как справиться с этим противоречием в re?

+5

Извините, но я понятия не имею, о чем вы говорите. –

+2

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

+0

Речь идет о смешивании чистой виртуальности и «окончательных» методах в одном классе. Поскольку isError() является чисто виртуальным, мне нужно переопределить все виртуальные методы классов, которые не работают для «окончательного» oeprator. Это проблема, о которой я говорю. VS 2010 жаловался на эту комбинацию. Я тоже думал, как Майк Сеймур, но MS VS не скомпилировал это. – gilgamash

ответ

5

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

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

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


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

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

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


#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() 
+0

Да, спасибо, я смутил то, что вы заявляете. Мой плохой, извините за неудобства и спасибо за помощь! – gilgamash

+0

@gilgamash не забудьте пометить ответ как принятый, если вы удовлетворены предоставленной информацией, рад быть полезным. –

+0

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

2

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

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

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

Смежные вопросы