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. ...
随机推荐
- 设置IDEA中的web
- python-中缀转换后缀并计算
这个好像比较简单. 前缀规则好像还没有理清楚. # coding = utf-8 class Stack: def __init__(self): self.items = [] # 是否为空 def ...
- eclipse中文乱码修改新方法
方法背景:想看别人的JAVA项目,导入eclipse后出现中文乱码,在设置了所有的工作空间都为UTF-8以后都没有用,并且项目Resource选项没有GBK选项,或统一选择GBK后会使其他项目出现中文 ...
- [转] babel的使用
一.配置文件.babelrc .babelrc 文件存放在项目的根目录下. { "presets": [], "plugins": [] } presets 字 ...
- [转] js在浏览器端对二进制流进行AES加密和解密
开始解密 简单了解一下所用的的AES加密算法,我们用的是AES的CFB加密方式,服务端会提供给我一个key和iv的二进制字节串.密文也是二进制字节串. 我用的加密/解密插件: crypto-js 一般 ...
- 最小生成树模板【kruskal & prim】
CDOJ 1966 Kruskal 解法 时间复杂度O(mlogm) m为边数,这里主要是边排序占时间,后面并查集还好 #include <cstdio> #include <cst ...
- Codeforces 305E Playing with String 博弈
我们可以把每段连续可以选的字符看成一个游戏, 那么sg[ i ]表示连续 i 个字符可选的sg值. 然后找找第一个就好啦. #include<bits/stdc++.h> #define ...
- Ansible 详解
原文:https://www.cnblogs.com/keerya/p/7987886.html#_label0,有改动 一.Ansible简介 1.ansible是什么 a.ansible是新出现的 ...
- Mysql8远程不能登录报错
mysql8远程登录报错Client does not support authentication protocol requested by server; consider upgrading ...
- POJ1330Nearest Common Ancestors
去博客园看该题解 题意 第一行输入T,有T组数据. 对于每组数据,给出一棵树,先输入n,然后n-1行,每行两个数a,b,表示a是b的父亲:第n行输入两个数A,B表示询问A和B的最近公共祖先. 题解 L ...