【发布时间】:2011-10-23 06:08:17
【问题描述】:
假设我在一个基类中有两个版本的operator->(在 const 上重载)。如果我说
using Base::operator->;
在派生类中,我可以访问两个版本还是只访问非常量版本?
【问题讨论】:
标签: c++ inheritance operator-overloading constants using-declaration
假设我在一个基类中有两个版本的operator->(在 const 上重载)。如果我说
using Base::operator->;
在派生类中,我可以访问两个版本还是只访问非常量版本?
【问题讨论】:
标签: c++ inheritance operator-overloading constants using-declaration
与隐藏名称相同的业务。要么全有,要么全无。使用声明 (7.3.3) 会带来 name,而不是 member。
ISO/IEC 14882 (2003),7.3.3。 1/ using-declaration 将名称引入声明式 using 声明出现的区域。这个名字是同义词 用于在其他地方声明的某个实体的名称。
我鼓励你阅读 7.3.3,里面有一些微妙的东西。您不能 using-declare 模板,您 using-declare 名称所引用的所有成员都必须是可访问的,这些名称与找到 using 声明的块中的名称一起被考虑用于重载解析(即它们不隐藏任何东西) 等等等等。
【讨论】:
您可以访问该父级中具有相同名称的方法/运算符的所有版本。
【讨论】:
两者都有。你试过了吗? (该死的答案很短:嗯,这是示例:
#include <iostream>
#include <string>
struct bar
{
void foo() { std::cout << "non_c:foo()" << std::endl; }
void foo() const { std::cout << "c:foo()" << std::endl; }
};
class base
{
public:
bar* operator->() { return &b; }
bar const* operator->() const { return &b; }
private:
bar b;
};
class derived : public base
{
public:
using base::operator->;
};
int main(void)
{
const derived d = derived();
derived e;
d->foo();
e->foo();
}
【讨论】: