笔记:条款33: 避免遮掩继承而来的名称

编程入门 行业动态 更新时间:2024-10-09 02:24:13

笔记:条款33: 避免遮掩继承<a href=https://www.elefans.com/category/jswz/34/1766077.html style=而来的名称"/>

笔记:条款33: 避免遮掩继承而来的名称

这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。

当发生继承时,如下所示,子类的mf1会遮挡父类中的mf1()和mf1(int), 编译器默认的行为是不允许父类中的重载函数派生到子类中,如果想在子类中使用父类中的重载函数,那么要在子类中使用using,本例中就是using A::mf1;

class A {
public:virtual void mf1() = 0;virtual void mf1(int) {cout << "A mf1" << endl;}
};
class B: public A {
public:void mf1() {cout << "B mf1" << endl;}
};int main() {B b;b.mf1();
}

如果我们只想使用基类中的mf1(),那么using声明式在这里派不上用场,因为using声明式会令继承而来的某给定名称的所有同命函数都在派生类中可见,解决方法是提供一个转交函数。如下B类中的mf1就是转交函数。

class A {
public:virtual void mf1() = 0;virtual void mf1(int) {cout << "A mf1" << endl;}
};
class B: private A {
public:using A::mf1;void mf1() {A::mf1(1);}
};
int main() {B b;b.mf1();
}

请记住

继承类内的名称会遮掩基类内的名称。

为了让被遮掩的名称再见天日,可使用using声明式或转交函数。

更多推荐

笔记:条款33: 避免遮掩继承而来的名称

本文发布于:2024-02-14 01:06:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1761454.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:而来   条款   名称   笔记

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!