系列文章目录
- C++11 26-多成员的
using
声明 Multi member using declaration
Overview
1.多成员的 using
声明 Multi member using declaration
在 C++11 中,using
声明可以用于引入基类成员到派生类中,这使得派生类可以访问基类的成员。这种声明特别有用,当基类中的成员由于命名空间或继承体系的不同而不直接可见时。
1.1.基本用法
在 C++11 之前,如果一个类继承自多个基类,并且这些基类有同名的成员,那么在派生类中访问这些成员可能会变得复杂。C++11 引入了多成员的 using
声明,允许派生类明确地指定它想要使用的基类成员。
1.2.示例
假设有两个基类 A
和 B
,它们都有一个名为 foo
的成员函数,而派生类 C
继承自这两个基类:
#include <iostream>
class A {
public:
void foo() {
std::cout << "A's foo\n"; }
};
class B {
public:
void foo() {
std::cout << "B's foo\n"; }
};
class C : public A, public B {
public:
// 使用 using 声明来指定使用 A 的 foo
using A::foo;
void test() {
foo(); // 调用 A 的 foo
}
};
int main() {
C obj;
obj.foo(); // 输出 "A's foo"
obj.test(); // 输出 "A's foo"
return 0;
}
在这个例子中,C
使用 using A::foo;
声明来指定它想要使用 A
的 foo
函数。这样,在 C
的作用域内,foo
将直接引用 A
的 foo
函数。
1.3.多成员 using
声明
如果需要在派生类中引入多个成员,可以连续使用多个 using
声明:
class C : public A, public B {
public:
using A::foo;
using B::foo;
void testA() {
foo(); // 调用 A 的 foo,因为 A 在 B 之前被继承
}
void testB() {
B::foo(); // 明确调用 B 的 foo
}
};
在这个例子中,C
通过两个 using
声明引入了 A
和 B
的 foo
函数。在没有明确指定的情况下,如果两个基类的成员具有相同的名称,派生类将根据继承的顺序来决定调用哪个基类的成员。
1.4.注意事项
- 使用
using
声明时,如果基类成员有同名函数,需要明确指定使用哪个基类的成员。 using
声明可以减少名称查找的歧义,使得代码更加清晰。- 在复杂的继承体系中,合理使用
using
声明可以提高代码的可读性和维护性。
这种特性在处理复杂的类继承关系时非常有用,尤其是在涉及多个基类有同名成员的情况下。
2.在 C++11 中,除了多成员的 using
声明,还有哪些其他方式可以解决基类成员的继承问题?
在 C++11 中,除了使用多成员的 using
声明来解决基类成员的继承问题,还有其他几种方法可以处理或避免继承中的名称冲突和访问问题:
-
显式作用域分辨:
在派生类中调用成员函数时,可以使用基类的作用域解析运算符(::
)来明确指定要调用的基类成员。class Derived : public Base { public: void func()