看一个例子:
class Base {
public:
virtual void mf1() = 0;
virtual void mf1(int){}
virtual void mf2(){}
void mf3(){}
void mf3(double){}
};
class Derived: public Base {
public:
virtual void mf1(){}
void mf3(){}
void mf4(){}
};
这段代码带来的行为会让每一位第一次面对它的c++程序员大吃一惊,base class 内所有名为mf1各mf3的函数都被derived class内的mf1和mf3函数遮掩掉了。从名称查找观点来看,Base::mf1和Base::mf3不再被Derived继承!
Derived d;
int x;
d.mf1();
d.mf1(x); //错误!因为Derived::mf3遮掩了Base::mf1
d.mf2();
d.mf3();
d.mf3(x); //错误!因为Derived::mf3遮掩了Base::mf3
上述行为违反base和derived class之间的is-a关系,因此你几乎总会要推翻c++对“继承而来的名称”的缺省遮掩行为。可以使用using声明式达成目标:
class Derived: public Base {
public:
using Base::mf1; //让Base class内名为mf1和mf3的
using Base::mf3; //所有东西在Derived作用域内都可见
virtual void mf1(){}
void mf3(){}
void mf4(){}
};
注:
以c++进行面向对象编程,最重要的一个规则是:public inheritance(公开继承)意味着“is-a”(是一种)的关系。
摘自Effective C++
分享到:
相关推荐
千锋C++笔记.zip
C++笔记.rarC++笔记.rarC++笔记.rarC++笔记.rarC++笔记.rarC++笔记.rarC++笔记.rarC++笔记.rar
C++学习笔记C++学习笔记C++学习笔记C++学习笔记C++学习笔记
c++学习笔记/知识要点精华版
QT 4 c++ 笔记 QT 4 c++ 笔记 QT 4 c++ 笔记 QT 4 c++ 笔记 QT 4 c++ 笔记 QT 4 c++ 笔记
C++笔记.md
作者全部手打创作的自考C++笔记,含课本中例子的详细分析,(上)共47200字,就是没有学过C语言的人认真看了以后,也可学会并通过C++自考
c++笔记.txt 本人所写,内容丰富,全面。包含c++的各个知识点。供广大网友学习!
自己整理的c++笔记,初学者可以参考,必有益处
我自己的笔记,根据C++知识点来概括,里面有例子,详解,也有一些重点算法(10个),关键是类,结构,函数的笔记,唉。。自己记录的,写得很鸟的,只适合鸟鸟们看,高手千万不要下,不然笑话我啊。但写得辛苦,10分...
一个student类,lectureTeatre类,继承抽象module类,通过继承来实现接口
某课网C++远征的课程截图整理的笔记,该课程适合入门,
c++完美学习笔记c++完美学习笔记c++完美学习笔记c++完美学习笔记
c++学习笔记.pdf
C++笔记精华,非常不错的,初学者的学习c++的笔记。大学中的
C++学习笔记
大一下c++笔记.md
基础C/C++课程,包含UC、C++笔记,适合初学者使用。含有文本文档。
二级C++笔记.docx
c++程序设计 继承与派生实验(二) 1. 进一步掌握类的派生与继承的概念、应用方法 2. 掌握继承方式对成员访问权限的影响 3. 掌握虚基类的用法