Разница между виртуальным void funcFoo() const = 0 и virtual void funcFoo() = 0;
У меня есть объявление в cpp, где функция похожа:
virtual void funcFoo() const = 0;
Я предполагаю, что может быть унаследован другим классом, если он объявлен явным, но какая разница между
virtual void funcFoo() = 0;
Мне важно улучшить свое программирование, и я хочу знать разницу. Мне не нужна неисправность, вызванная плохим наследованием.
Спасибо заранее.
Ответы
Ответ 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