C++程序设计方法3:函数重写
派生类对象包含从基类继承类的数据成员,他们构成了“基类子对象”
基类中的私有成员,不允许在派生类成员函数中被访问,也不允许派生类的对象访问他们;
真正体现基类私有,对派生类也不开放其权限;
基类中的公有成员:
若是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:函数重写的更多相关文章
- C++程序设计方法4:函数模板
函数模板 有些算法与类型无关,所以可以将函数的参数类型也定义为一种特殊的“参数”,这样就得到“函数模板” 定义函数模板的方法:template<typename T> 返回类型 函数名称( ...
- java基础疑难点总结之成员变量的继承,方法重载与重写的区别,多态与动态绑定
1.成员变量的继承 1.1要点 子类用extends关键字继承父类.子类中可以提供新的方法覆盖父类中的方法.子类中的方法不能直接访问父类中的私有域,子类可以用super关键字调用父类中的方法.在子类中 ...
- java方法重载 与 重写
class ChongZai{ public void a(int a); public void a(Strting a); public void a(int a,int b); } 如上就是一个 ...
- 《程序设计方法》【PDF】下载
内容简介 <程序设计方法>主要以方法为主导,结合C语言,把程序设计方法学研究中若干成熟的理论和方法用通俗易懂的语言描述出来.<程序设计方法>还选取趣味性强.技巧性高.能够启发学 ...
- mooc- 基本程序设计方法week1,week2
学习了第一单元我们几本可以写出10行左右的代码. week1:python编程之基本方法 1.从计算机到程序设计语言: 理解计算机:计算机是能够根据一组指令操作数据的机器. 功能性:可以进行数据计算 ...
- c++虚函数&重写
虚函数是C++中实现多态的一种方法,父类A的一个函数声明为虚函数,在子类B中覆盖定义之后,当在调用的时候使用A*a=new B(),此时调用对应的那个虚函数的名字,则会执行B中的函数.当父类中没有定义 ...
- python 多态、多继承、函数重写、迭代器
用于类的函数 issubclass(cls,class_or_tuple) 判断一个类是否继承自其他的类,如果此类cls是class或tuole中的一个派生(子类)则返回True,否则返回False ...
- Python全栈工程师(多继承、函数重写)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 补充: 对象 --------- ...
- Objective-C学习笔记(二十二)——初始化方法init的重写与自己定义
初学OC.对init这种方法不是非常了解.我们如今来分别对init方法进行重写以及自己定义,来加深对他的了解. 本样例也是用Person类来进行測试. (一)重写init方法. (1)在Person. ...
随机推荐
- python爬虫-淘宝商品密码(图文教程附源码)
今天闲着没事,不想像书上介绍的那样,我相信所有的数据都是有规律可以寻找的,然后去分析了一下淘宝的商品数据的规律和加密方式,用了最简单的知识去解析了需要的数据. 这个也让我学到了,解决问题的方法不止一个 ...
- 常见的HTTP响应状态码解析
概要 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果.借助于状态码,浏览器(或者说用户)可以知道服务器是正常的处理了请求,还是出现了错误. 状态码以3位数字和原因短语组成,例如 200 ...
- nodejs 环境安装
参考网站 http://www.runoob.com/nodejs/nodejs-http-server.html https://github.com/nodesource/distribution ...
- GoogleTest入门
Googletest入门 来源:https://github.com/google/googletest/blob/master/googletest/docs/primer.md P.S. gmoc ...
- 关于浏览器对html, js,css的解析先后顺序的理解
1.首先要了解页面的结构(包含哪些元素?哪些计算机语言能够在页面中运行 ) (1)html 不仅可以包含文字,还可以包含图片.链接,甚至音乐.程序等非文字元素的标记语言 ...
- nginx error.log 提示 [error] 887#887: *58 FastCGI sent in stderr: "PHP message: PHP Warning: mysql_connect(): Headers and client library minor version mismatch. Headers:50556 Library:50637
0. 1.问题 1.1现象: nginx error.log 提示 [error] 887#887: *58 FastCGI sent in stderr: "PHP message: PH ...
- C# 之 6.0 新特性
VS2015内置的C#版本为6.0,学习了一下C#6.0的新特性. 特性1:自动属性初始化 (Initializers for auto-properties) 以前我们是这么写的 public st ...
- [转]Howto: 使用ImageBrush替换PictureMarkerSymbol以加强graphic显示性能
原文地址:http://support.esrichina-bj.cn/2009/0728/1007.html 文章编号 : 37033 软件: ArcGIS API for Microsoft Si ...
- 51Nod1601 完全图的最小生成树计数 Trie Prufer编码
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1601.html 题目传送门 - 51Nod1601 题意 题解 首先我们考虑如何求答案. 我们将所有 ...
- hive启用压缩
<property> <name>hive.exec.compress.intermediate</name> <value>true</valu ...