【发布时间】:2011-03-05 16:33:43
【问题描述】:
在类定义中使用 using 是什么意思?
class myClass {
public:
[...]
using anotherClass::method;
};
【问题讨论】:
标签: c++ language-features using
在类定义中使用 using 是什么意思?
class myClass {
public:
[...]
using anotherClass::method;
};
【问题讨论】:
标签: c++ language-features using
该声明取消隐藏一个基类成员。这最常用于允许成员函数的重载。示例:
class Base {
public:
void method() const;
};
class Derived : public Base {
public:
void method(int n) const;
// Without the using, you would get compile errors on d.method();
using Base::method;
};
【讨论】:
我见过的案例:
class A
{
void foo(int);
void foo(float);
}
class B : public A
{
void foo(string);
}
B b;
b.foo(12); // won't work!
因为我在 B 中实现了一个具有不同签名的新 foo 函数,所以它对 A 隐藏了 foo 函数。为了覆盖这种行为,我会这样做:
class B : public A
{
void foo(string);
using A::foo;
}
【讨论】:
大多数情况下,这样的语法是这样使用的:
class derived : public base {
public:
[...]
using base::method;
};
这里的using 声明隐藏来自父类的成员声明。如果derived 中的另一个成员声明可能会隐藏base 中的成员,这有时是必要的。
【讨论】:
如果 anotherClass 是包含类似成员函数的基类
virtual void f();
你决定在派生类中重载函数
virtual void f(int);
它在基类中“隐藏”了 f()。例如,通过指向派生类的指针调用 f() 会导致错误,因为编译器不再“看到” f() 的版本不再从基类中获取参数。
通过写作
using Base::f;
您可以将基类函数带回作用域,从而启用重载解析,正如您最初可能期望的那样。
【讨论】: