virtual void funcFoo()const = 0和virtual void funcFoo()= 0之间的区别;

时间:2012-04-02 09:58:52

标签: c++ inheritance

我在cpp中有一个声明,其函数如下:

virtual void funcFoo() const = 0;

我认为如果声明为显式,则可以由另一个类继承,但

之间的区别是什么
virtual void funcFoo() = 0;

对我来说重要的是改进我的编程,我想知道其中的区别。我不希望遗传不良造成的故障。

提前致谢。

5 个答案:

答案 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