我在cpp中有一个声明,其函数如下:
virtual void funcFoo() const = 0;
我认为如果声明为显式,则可以由另一个类继承,但
之间的区别是什么virtual void funcFoo() = 0;
对我来说重要的是改进我的编程,我想知道其中的区别。我不希望遗传不良造成的故障。
提前致谢。
答案 0 :(得分:33)
第一个签名意味着可以在派生类型的const实例上调用该方法。不能在const实例上调用第二个版本。它们是不同的签名,因此通过实现第二个,您不会实现或覆盖第一个版本。
struct Base {
virtual void foo() const = 0;
};
struct Derived : Base {
void foo() { ... } // does NOT implement the base class' foo() method.
};
答案 1 :(得分:14)
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
关于const correctectness的最佳教程或Faq是parashift的C ++ FAQ:
看看:http://www.parashift.com/c++-faq-lite/const-correctness.html
答案 2 :(得分:11)
不同之处在于,第一个函数可以在const
个对象上调用,而第二个函数可以在const
个对象上调用。而且,第一个函数只能在同一个对象上调用其他{{1}}成员函数。关于继承,它们的行为方式相同。
另请参阅有关此主题的C++ FAQ。
答案 3 :(得分:3)
两个虚拟函数具有不同的签名,但继承将以相同的方式工作。前者是const方法,只能支持const操作(方法)和对象。
答案 4 :(得分:1)
const方法无法改变对象的状态所以
virtual void funcFoo() const = 0;
将在此类的const实例中调用,区别为
virtual void funcFoo() = 0;
只能在非常量实例中调用。 尝试用谷歌搜索c ++中的const逻辑。 http://en.wikipedia.org/wiki/Const-correctness