十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

嵌入式学习笔记-名称遮蔽(Name Hiding)

嵌入式学习笔记-名称遮蔽(Name Hiding) 基本规则派生类中的同名成员无论参数是否相同会完全遮蔽基类中的同名成员。即使基类成员有重载版本也会被一起遮蔽。典型示例(1) 变量遮蔽class Base { public: int value 10; }; class Derived : public Base { public: double value 3.14; // 遮蔽Base::value }; Derived d; cout d.value; // 输出3.14访问派生类成员 cout d.Base::value; // 输出10显式访问基类成员函数遮蔽含重载class Base { public: void func() { cout Base::func()\n; } void func(int) { cout Base::func(int)\n; } }; class Derived : public Base { public: void func(double) { cout Derived::func(double)\n; } }; Derived d; d.func(1.0); // 合法Derived::func(double) // d.func(1); // 错误Base::func(int)被遮蔽 d.Base::func(1); // 合法显式调用基类函数解决方案(1) 使用using声明引入基类成员class Derived : public Base { public: using Base::func; // 引入基类所有重载版本 void func(double) {} }; Derived d; d.func(1); // 现在合法调用Base::func(int) d.func(1.0); // 调用Derived::func(double)作用域解析符::d.Base::func(); // 强制指定基类版本运算符重载的遮蔽派生类定义同名运算符会遮蔽基类所有重载版本class Base { public: void operator(int) {} }; class Derived : public Base { public: void operator(double) {} }; Derived d; // d 1; // 错误Base::operator(int)被遮蔽 d 1.0; // 合法
返回列表