Разница между виртуальным void funcFoo () const = 0 и виртуальным void funcFoo () = 0; - PullRequest
22 голосов
/ 02 апреля 2012

У меня есть объявление в cpp, где функция похожа на:

virtual void funcFoo() const = 0;

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

virtual void funcFoo() = 0;

Для меня важно улучшить мое программирование, и я хочу знать разницу.Я не хочу неисправности, вызванной плохим наследованием.

Заранее спасибо.

Ответы [ 5 ]

33 голосов
/ 02 апреля 2012

Первая подпись означает, что метод может быть вызван для экземпляра const производного типа. Вторая версия не может быть вызвана на экземплярах const. Это разные сигнатуры, поэтому, реализуя вторую, вы не реализуете или не отменяете первую версию.

struct Base {
   virtual void foo() const = 0;
};

struct Derived : Base {
   void foo() { ... } // does NOT implement the base class' foo() method.
};
14 голосов
/ 02 апреля 2012
virtual void funcFoo() const = 0;
- You can't change the state of the object
- You can call this function via const objects
- You can only call another const member functions on this object

virtual void funcFoo() = 0;
- You can change the state of the object
- You can't call this function via const objects

Лучшим учебником или Faq, который я видел по поводу корректности констант, был C ++ FAQ от parashift:

Взгляните: http://www.parashift.com/c++-faq-lite/const-correctness.html

11 голосов
/ 02 апреля 2012

Разница в том, что первая функция может вызываться на const объектах, а вторая - нет. Более того, первая функция может вызывать только другие const функции-члены на том же объекте. Что касается наследования, они ведут себя одинаково.

См. Также C ++ FAQ по этой теме.

3 голосов
/ 02 апреля 2012

Две виртуальные функции имеют разные подписи, но наследование будет работать одинаково. Первый является методом const и может поддерживать только операции (методы) и объекты const.

1 голос
/ 02 апреля 2012
Методы

const не могут изменить состояние объекта, поэтому

virtual void funcFoo() const = 0;

будет вызываться в экземплярах const этого класса с разницей

virtual void funcFoo() = 0;

, которая может быть вызванатолько в непостоянных случаях.Попробуйте Google для const логики в C ++.http://en.wikipedia.org/wiki/Const-correctness

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