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

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

virtual void funcFoo() const = 0;

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

virtual void funcFoo() = 0;

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

提前致谢。

【问题讨论】:

标签: c++ inheritance


【解决方案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

      【讨论】:

        猜你喜欢
        • 2015-09-11
        • 1970-01-01
        • 2015-05-26
        • 2015-04-30
        • 2016-03-15
        • 2015-09-26
        • 1970-01-01
        • 2014-09-09
        • 1970-01-01
        相关资源
        最近更新 更多