2

这是我的问题。我创建了一个类,其成员函数声明为const使用我无法修改的外部函数(在其他人的代码中声明)并且未声明const。更确切地说

别人的代码

class B {
public:
    void foo();
};

我的代码

class A : public B {
public:
    void bar() const {
        this->foo();
    }
};

我知道对于成员数据,我们可以通过使用来强制 const 正确性mutableor const_cast。我怎样才能“破解”foo让我的编译器明白我想像使用它一样使用它,即使它没有在其他人的代码中声明?

4

4 回答 4

6
  1. 不要那样做。

  2. 不要这样做:

例子:

class A : public B { 
public: 
    void bar() const { 
        const_cast<B*>(static_cast<const B*>(this))->foo();
    } 
}; 

编辑:有效的用例是:

  1. 该函数B::foo() 不会修改 state,并且可以声明const,但是......
  2. 写信的人B::foo()忘记将其声明为 const,并且...
  3. 你不能改变它,因为它会破坏你无法控制的东西。

理论上这不可能发生,但实际上有时会发生。

正如其他回答者正确所说的那样,更好的答案是B::foo()修复,或者提供一个做同样事情的替代函数,声明为 const。

于 2012-05-31T10:37:10.740 回答
3

只需使您的函数非常量。这是正确的做法。

这清楚地表明您将修改您的状态。

于 2012-05-31T10:29:52.953 回答
1

要么制作B::foo()const,要么制作A::bar()非常量。两者之一。

于 2012-05-31T10:33:01.870 回答
0

您可以声明 bar() 如下:

void bar() const {
    B *that = (B *) this;
    that->foo();
}

不确定是否有任何意外的副作用。

于 2012-05-31T10:38:10.103 回答