C++类中using Parent::Grandparent语法的实际作用是什么?
语法本质解释
using B::A 的核心作用是将父类B作用域中继承得到的注入类名A引入到当前C类的作用域,本质是让类型A在C的作用域内可以被直接访问。
核心原理:注入类名规则
C++标准规定,每个类都会将自身的类名「注入」到自己的作用域中,这个注入的类名同时会被派生类继承:
- 对于基类A,它的作用域内默认存在一个指代自身类型的注入名
A - 派生类B公有继承A后,B的作用域会继承这个注入名,因此
B::A是合法的限定名,完全等价于全局的::A类型 using B::A就是把这个B作用域下的A类型名引入到C的作用域,之后在C的内部直接写A就可以指代::A类型
和继承构造的差异
你提到的using B::B是继承构造的语法,二者的匹配规则完全不同:
using 限定名语法中,只有当::右侧的名称和左侧类的类名完全相同时,才会匹配到左侧类的构造函数- 本例中
B::A的右侧名称是A,和左侧的B不同,因此不会匹配构造函数,只会匹配B作用域下同名的类型名
为什么直接using A/using B不合法
类作用域中的using声明要求必须是带作用域前缀的限定名,不能直接跟一个普通标识符,因此无作用域前缀的using A、using B语法上就不被允许。
效果演示
你可以通过以下代码验证它的作用:
struct A {}; struct B : A {}; struct C : B { using B::A; // 引入后可以直接在C内部用A定义对象 A getA() { return A{}; } };
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

