派生类对象包含从基类继承类的数据成员,他们构成了“基类子对象”
基类中的私有成员,不允许在派生类成员函数中被访问,也不允许派生类的对象访问他们;
真正体现基类私有,对派生类也不开放其权限;
基类中的公有成员:
若是public继承,则成为派生类的公有成员,既可以在派生类成员函数中访问,
也可以被派生类的对象访问; 若是private继承方式,则只能供派生类成员函数访问,不能被派生类的对象访问; #include <iostream>
using namespace std;
class B
{
public:
void f()
{
cout << "in B::f()..." << endl;
}
};
class D1 :public B {};
class D2 :private B
{
public:
void g()
{
cout << "in D2::g(),calling f()..." << endl;
f();//私有继承时,基类接口在子类成员函数中可以使用;
}
}; int main()
{
cout << "in main()..." << endl; D1 obj1;
cout << "calling obj1.f()..." << endl; D2 obj2;
cout << "calling obj2.g()..." << endl;
obj2.g();
//error f()为私有继承,所以obj2.f()//基类接口不允许子类对象调用;
}

重写与重载的区别:

函数重载要求函数名字必须一样,函数的参数要求不一样;

而函数的重写则是函数名字和函数的参数必须都一样;

基类已定义的成员函数,在派生类中可以重新定义它,这被称为函数重写(override)

重写发生时,基类中该成员函数的其他重载函数都将被屏蔽,不能提供给派生类对象使用;

可以在派生类中使用using 类名::成员函数名;在派生类中恢复指定的基类成员函数(即去掉屏蔽),使它重新可以使用;

#include <iostream>
using namespace std; class T {};
class B
{
public:
void f()
{
cout << "B::f()\n";
}
void f(int i)
{
cout << "B::f(" << i << ")\n";
}
void f(double d)
{
cout << "B::f(" << d << ")\n";
}
void f(T)
{
cout << "B::f(T)\n";
}
}; class D1 :public B
{
public:
void f(int i)
{
cout << "D1::f(" << i << ")\n";
}
}; int main()
{
D1 d;
d.f();
d.f(4.9);//编译警告,会执行自动类型转换
//d.f();//被屏蔽,编译错误
//d.f(T());//被屏蔽,编译错误
//f()被重写,故无法访问基类中同名的成员函数;其成员函数会被屏蔽掉;
return ;
}

如果想要派生类中依然可以访问基类同名的成员函数,可以恢复基类中成员函数,方法如下:

在派生类中添加using B::f;就可以实现;

class D1 : public B
{
public:
using B::f;//使用using基类名::函数名;恢复基类函数
void f(int i) { cout << "D1::f(" << i << ")\n"; }
};

C++程序设计方法3:函数重写的更多相关文章

  1. C++程序设计方法4:函数模板

    函数模板 有些算法与类型无关,所以可以将函数的参数类型也定义为一种特殊的“参数”,这样就得到“函数模板” 定义函数模板的方法:template<typename T> 返回类型 函数名称( ...

  2. java基础疑难点总结之成员变量的继承,方法重载与重写的区别,多态与动态绑定

    1.成员变量的继承 1.1要点 子类用extends关键字继承父类.子类中可以提供新的方法覆盖父类中的方法.子类中的方法不能直接访问父类中的私有域,子类可以用super关键字调用父类中的方法.在子类中 ...

  3. java方法重载 与 重写

    class ChongZai{ public void a(int a); public void a(Strting a); public void a(int a,int b); } 如上就是一个 ...

  4. 《程序设计方法》【PDF】下载

    内容简介 <程序设计方法>主要以方法为主导,结合C语言,把程序设计方法学研究中若干成熟的理论和方法用通俗易懂的语言描述出来.<程序设计方法>还选取趣味性强.技巧性高.能够启发学 ...

  5. mooc- 基本程序设计方法week1,week2

    学习了第一单元我们几本可以写出10行左右的代码. week1:python编程之基本方法 1.从计算机到程序设计语言: 理解计算机:计算机是能够根据一组指令操作数据的机器. 功能性:可以进行数据计算 ...

  6. c++虚函数&重写

    虚函数是C++中实现多态的一种方法,父类A的一个函数声明为虚函数,在子类B中覆盖定义之后,当在调用的时候使用A*a=new B(),此时调用对应的那个虚函数的名字,则会执行B中的函数.当父类中没有定义 ...

  7. python 多态、多继承、函数重写、迭代器

    用于类的函数 issubclass(cls,class_or_tuple) 判断一个类是否继承自其他的类,如果此类cls是class或tuole中的一个派生(子类)则返回True,否则返回False ...

  8. Python全栈工程师(多继承、函数重写)

    ParisGabriel                每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图 Python人工智能从入门到精通 补充: 对象 --------- ...

  9. Objective-C学习笔记(二十二)——初始化方法init的重写与自己定义

    初学OC.对init这种方法不是非常了解.我们如今来分别对init方法进行重写以及自己定义,来加深对他的了解. 本样例也是用Person类来进行測试. (一)重写init方法. (1)在Person. ...

随机推荐

  1. 社会单位消防安全户籍化管理系统——半自动提交V1.0版本

    社会单位消防安全户籍化管理系统——半自动提交V1.0版本 首先先上代码,开发这个小程序其实是用来帮助同事完成一项每天都做的繁琐事件,以往需要花费十分钟做这件事情,现在就是傻瓜式,点几下鼠标就好了.本来 ...

  2. 深入理解javascript原型和闭包——从【自由变量】到【作用域链】

    一直对闭包和变量作用域链模糊不清!!!有时都怀疑自己是不是脑袋秀逗啦还是范萌!! 先解释一下什么是“自由变量”. 在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用 ...

  3. Elasticsearch 备忘

    Elasticsearch7.0版本在查询时需要增加 “track_total_hits”:true 来强制进行准确的计数,默认为 “track_total_hits”:10000, 而且返回的hit ...

  4. [转] UniCode编码表

    Unicode编码则是采用双字节16位来进行编号,可编65536字符,基本上包含了世界上所有的语言字符,它也就成为了全世界一种通用的编码,而且用十六进制4位表示一个编码,非常简结直观,为大多数开发者所 ...

  5. Spring boot自定义启动字符画(banner)

    spring boot项目启动时会打印spring boot的ANSI字符画,可以进行自定义. 如何自定义 实现方式非常简单,我们只需要在Spring Boot工程的/src/main/resourc ...

  6. python基础——循环(for,while,break,continue)

    for while . break:退出循环 continue:退出本次循环 例子 for i range(0,101,2): print(i) --------------------------- ...

  7. windows server远程连接提示“终端服务器超出了最大允许连接”

  8. net core体系-Xamarin-1概要

    大家在开发领域都知道Java是跨平台的,但是很多人认为.NET是只能在Windows下运行,不具有跨平台的特性,这种说法其实是不妥的. .NET其实在设计之初也是考虑像Java一样跨平台的,我们知道. ...

  9. 今天开始学习php,粘一些重点放这以便查看记忆。

    1.PHP的变量用$定义. PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中. index 保存变量的名称.这个数组可以在函数内部访问,也可以直接用来更新全局变量. 2. ...

  10. sql对于字符串的处理