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

Posted

技术标签:

【中文标题】virtual void funcFoo() const = 0 和 virtual void funcFoo() = 0; 之间的区别【英文标题】:Difference between virtual void funcFoo() const = 0 and virtual void funcFoo() = 0; 【发布时间】:2012-04-02 09:58:51 【问题描述】:

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

virtual void funcFoo() const = 0;

我假设如果声明为显式,则可以被另一个类继承,但有什么区别

virtual void funcFoo() = 0;

对我来说改进我的编程很重要,我想知道其中的区别。我不希望由于继承错误而导致故障。

提前致谢。

【问题讨论】:

***.com/questions/751681/… 简答:const 正确性。 【参考方案1】:

第一个签名意味着可以在派生类型的 const 实例上调用该方法。第二个版本不能在 const 实例上调用。它们是不同的签名,因此通过实施第二个,您并没有实施或覆盖第一个版本。

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

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

【讨论】:

不,相反:第一个函数可以在 const 和非 const 实例上调用,而第二个函数只能在非 const 实例上调用(我知道这很复杂,我弄错了也是第一次:-)【参考方案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.

我见过的关于 const 正确性的最佳教程或常见问题解答是 parashift 的 C++ 常见问题解答:http://www.parashift.com/c++-faq-lite/const-correctness.html

【讨论】:

这是最好的答案。我唯一搞砸的就是了解const 对象是什么..【参考方案3】:

不同之处在于第一个函数可以在const 对象上调用,而第二个不能。而且,第一个函数只能调用同一对象上的其他const成员函数。关于继承,它们的行为方式相同。

另请参阅有关此主题的 C++ FAQ。

【讨论】:

【参考方案4】:

这两个虚函数具有不同的签名,但继承的工作方式相同。前者是 const 方法,只能支持 const 操作(方法)和对象。

【讨论】:

【参考方案5】:

const方法不能改变对象的状态所以

virtual void funcFoo() const = 0;

将在该类的 const 实例中调用,区别在于

virtual void funcFoo() = 0;

只能在非常量实例中调用。 尝试用谷歌搜索 C++ 中的 const 逻辑。 http://en.wikipedia.org/wiki/Const-correctness

【讨论】:

以上是关于virtual void funcFoo() const = 0 和 virtual void funcFoo() = 0; 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Cadence Virtual.Component.CO-Design.v2.2-ISO 1CD(虚拟元件协同设计,VCC)

Attempt to invoke virtual method 'void android.support.v7.app.ActionBar.setHomeButtonEnabled(boo

Attempt to invoke virtual method 'void com.loopj.android.image.SmartImageView.setImageUrl(java.l

c++ 无法解析的外部符号 1>p.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __thiscall

什么是Virtual OC SSD?

C++多重继承与void*指针转换问题