Такая ситауция:
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?
Здравствуйте, Ytz, Вы писали:
Ytz>Здравствуйте, Аноним, Вы писали:
А>>Плохой ли это стиль, когда переопределяется невирутальный метод?
Ytz>Плохой, к тому же это не переопределение, а сокрытие.
А это тогда что?
http://ru.wikipedia.org/wiki/Переопределение_метода
Будут еще мнения?
Здравствуйте, Аноним, Вы писали:
А>Такая ситауция:
А>А>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(); }
};
Но, в тоже время, если сокрытие (впрочем, как и любую другую возможность языка) использовать бездумно и не к месту, то ничего хорошего не выйдет.
Здравствуйте, androider, Вы писали:
A>А это тогда что?
A>http://ru.wikipedia.org/wiki/Переопределение_метода
Это неграмотная статья в русской википедии. Обрати внимание как из примера в английской статье исчезло слово virtual