gpt4 book ai didi

C++ 子类重载乘法运算符隐藏基类重载取消引用运算符

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:32 24 4
gpt4 key购买 nike

是否不可能同时覆盖 operator*()(一元取消引用运算符)和 operator*(double f)(成员二进制乘法与原生 double 参数)在类层次结构的不同级别?

考虑:

// base.h:
template<typename T>
class base {
public:
base(T v) : m_v(v) { }
T& operator*() { return m_v; }
const T& operator*() const { return m_v; }
protected:
T m_v;
};

// special.h:
#include "base.h"
class super_double : public base<double> {
public:
super_double (double v) : base(v) { }
const super_double operator* (double f) { return super_double (m_v * f); }
};

我不明白为什么二进制成员operator*隐藏了从基类继承的解引用运算符,因为它们的调用约定不同。如果 super_double 未定义 operator*(double f),则以下代码编译正常,但如果定义,则会发出错误:

super_double q(289.3);
double d = *q; // Only good if super_double doesn't define operator*(double f)

如果 operator* 的两种形式都在模板基类中定义也很好。

为什么子类的二元operator*(double f)隐藏了基类的一元operator*()

最佳答案

在 C++ 中,名称查找重载解析 的单独步骤。名称查找是查找与名称对应的范围的过程。

引入名称Derived::operator* 表示在某个点搜索operator*(或使用* 作为运算符)其中 Derived 在范围内,会将名称解析为 Derived::operator*。然后,对存在的任何 Derived::operator* 重载进行重载解析。

要进行重载解析,还要考虑当前名为 Base::operator* 的函数,您需要通过以下方式将这些函数引入 Derived:

using Base::operator*;

Derived 类中。这意味着名称 Derived::operator* 现在指的是所有三个函数,重载解析将从它们中选择。

关于C++ 子类重载乘法运算符隐藏基类重载取消引用运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39400946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com