Подтвердить что ты не робот

Разница между виртуальным void funcFoo() const = 0 и virtual void funcFoo() = 0;

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

virtual void funcFoo() const = 0;

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

virtual void funcFoo() = 0;

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

Спасибо заранее.

4b9b3361

Ответ 1

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

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

struct Derived : Base {
   void foo() { ... } // does NOT implement the base class' foo() method.
};

Ответ 2

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, который я видел о константной коррективности, - это часто задаваемые вопросы по С++ с помощью parashift:

Посмотрите: http://www.parashift.com/c++-faq-lite/const-correctness.html

Ответ 3

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

См. также Часто задаваемые вопросы по С++ по этой теме.

Ответ 4

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

Ответ 5

Методы

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

virtual void funcFoo() const = 0;

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

virtual void funcFoo() = 0;

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