【问题标题】:Inside function, call its overloaded version在函数内部,调用它的重载版本
【发布时间】:2012-11-18 13:39:00
【问题描述】:

我想知道一件事。我有一个有 1 个重载成员函数的类:

class A{
    public:
    class const_iterator{};
    class iterator : public const_iterator{};
    iterator find(const K &key);
    const_iterator find(const K &key) const;
};

广告。 iterator 继承自 const_iterator,但它没有添加任何内容。

我想做的是,在正常的 find 调用 const find 中。像这样的:

typename A::iterator A::find(const K &key){
     const_iterator it(find(key));
     return (*(iterator*)&it);
}

我不需要非常量查找 ATM 的不同实现。有可能做这样的事情吗?因为现在我进入了无限循环,在 find 之前添加“A::”并没有改变任何东西。

【问题讨论】:

标签: c++ class overloading


【解决方案1】:

不幸的是,一般来说,没有干净的解决方案。

可以通过简单地将this 转换为A const* 来调用重载的find——但结果将是错误的类型(const_iterator 而不是iterator)在一般情况下可能不是这些之间的转换(您的(*(iterator*)&it) 在您的情况下不起作用)。

当然,在您的特殊情况下,由于您定义了这两个类,您可以通过向iterator 添加适当的构造函数来定义这样的转换:

class iterator : public const_iterator {
    iterator(const_iterator const& other) { 
        // Construct …
    }
};

然后你可以重写你的非constfind实现如下:

A::iterator A::find(const int &key){
    const_iterator it(const_cast<A const*>(this)->find(key));
    return static_cast<iterator>(it);
}

顺便说一下,请注意返回类型中没有typename。由于A::iterator 不是从属名称,因此您不需要(并且至少在 C++03 中不允许)在此处使用 typename

【讨论】:

  • 非常感谢,这行得通,我需要 typename 因为有模板等等,它也适用于简单的向下转换指针,我不必定义转换(可能是因为这个继承是主要只是名称更改,并没有实现任何新功能)
  • @MichałDębski 不,您确实需要定义转换。从基类到派生类没有自动向下转换。您的指针转换是被禁止的,并且会产生未定义的行为。
【解决方案2】:
const_cast<const A*>(this)->find(key);

【讨论】:

  • @Aardvark - 好点。我将static_cast 更改为const_cast。谢谢。
  • 我们为什么不使用static_castdynamic_cast 或常规演员表?为什么一定要用const_cast&lt;&gt;
  • @David 因为我们改变了对象的const-ness,仅此而已。此外,dynamic_cast 在这里是完全错误的,因为它仅适用于继承层次结构中的强制转换(即使这样,也只有当我们不确定强制转换是否会成功并相应地处理生成的 null 值时),这不是这里的情况。
  • @KonradRudolph 谢谢。我对那些 ---_cast&lt;&gt; 函数有点困惑。
  • const_cast 仅更改参数的常量。这是获得正确类型的最窄转换。 static_cast 也有效,但它不仅仅可以改变 const-ness,因此不应该在这里使用。风险在于更强大的演员阵容可以改变类型的其他方面;在像这样的简单情况下不太可能,但在更复杂的情况下,更强大的演员阵容可以掩盖编码错误。一般来说,使用最不强大的演员阵容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 2012-01-12
  • 2021-05-09
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多