Переопределение невиртуального метода в производном классе
От: Аноним  
Дата: 13.04.11 13:25
Оценка:
Такая ситауция:


class A {
public:
void doStuff() {}
};

class B : public A {
public:
void doStuff() {
   // do my own stuff
   A::doStuff();
}
};


Плохой ли это стиль, когда переопределяется невирутальный метод?
При этом класс A это класс из Qt (виджет), а B это уже "оболочка" вокруг. B::doStuff по смыслу идентичен A::doStuff. Или лучше имеет смысл называть B::doStuff как B::doMyStuff?
Re: Переопределение невиртуального метода в производном клас
От: Ytz https://github.com/mtrempoltsev
Дата: 13.04.11 13:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Плохой ли это стиль, когда переопределяется невирутальный метод?


Плохой, к тому же это не переопределение, а сокрытие.
Re[2]: Переопределение невиртуального метода в производном к
От: androider  
Дата: 13.04.11 14:05
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>Здравствуйте, Аноним, Вы писали:


А>>Плохой ли это стиль, когда переопределяется невирутальный метод?


Ytz>Плохой, к тому же это не переопределение, а сокрытие.


А это тогда что?
http://ru.wikipedia.org/wiki/Переопределение_метода

Будут еще мнения?
Re: Переопределение невиртуального метода в производном клас
От: rg45 СССР  
Дата: 13.04.11 14:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Такая ситауция:



А>
А>class A {
А>public:
А>void doStuff() {}
А>};

А>class B : public A {
А>public:
А>void doStuff() {
А>   // do my own stuff
А>   A::doStuff();
А>}
А>};
А>


А>Плохой ли это стиль, когда переопределяется невирутальный метод?


Для начала небольшая поправочка: в данном случае имеет место не переопределение, а сокрытие. Сокрытие иногда может оказаться весьма полезным. Например, с помощью сокрытия можно (частично) скомпенсировать отсутствие в языке ковариантности шаблонов:

#include <boost/shared_ptr.hpp>

using boost::shared_ptr;

class A
{
public:
  shared_ptr<A> foo() { return foo_impl(); }
private:
  virtual shared_ptr<A> foo_impl() = 0;
};

class B : public A
{
public:
  shared_ptr<B> foo(); 
private:
  shared_ptr<A> foo_impl() { return foo(); }
};


Но, в тоже время, если сокрытие (впрочем, как и любую другую возможность языка) использовать бездумно и не к месту, то ничего хорошего не выйдет.
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: Переопределение невиртуального метода в производном к
От: Ytz https://github.com/mtrempoltsev
Дата: 13.04.11 15:19
Оценка:
Здравствуйте, androider, Вы писали:

A>А это тогда что?

A>http://ru.wikipedia.org/wiki/Переопределение_метода

Это неграмотная статья в русской википедии. Обрати внимание как из примера в английской статье исчезло слово virtual
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.