c++ 子类切勿重新定义父类 non-virtual函数
子类如果重新定义了父类的non-virtual函数则不会有多态效果。
为方便描述,这里的方法和继承方式都用public。至于原因嘛,你懂的!
1:子类直接继承父类方法
class BaseOption
{
public:
void Function();
}; void BaseOption::Function()
{
cout<<"BaseOption::Function()"<<endl;
} class SubOption :
public BaseOption
{
}; int _tmain(int argc, _TCHAR* argv[])
{
SubOption obj;
BaseOption *pBase = &obj; SubOption *pSub = &obj; pBase->Function();
pSub->Function();
}
输出:
"BaseOption::Function()"
"BaseOption::Function()"
这里使用BaseOption 和SubOption 调用Function都能调进BaseOption::Function();
2:为了实现多态效果,把父类Function()改为virtual,在子类中重新实现
class BaseOption
{
public:
virtual void Function();
}; void BaseOption::Function()
{
cout<<"BaseOption::Function()"<<endl;
} class SubOption :
public BaseOption
{
public:
void Function();
}; void SubOption::Function()
{
cout<<"SubOption::Function()"<<endl;
} int _tmain(int argc, _TCHAR* argv[])
{
SubOption obj;
BaseOption *pBase = &obj; SubOption *pSub = &obj; pBase->Function(); pSub->Function();
}
这就是我们常说的多态。
输出:
"SubOption::Function()"
"SubOption::Function()"
3:子类直接重新定义父类non-virtual方法,这背时的做法,在这种情况下就没有了多态属性,至于这种设计方法的弊端,没得说。
class BaseOption
{
public:
void Function();
}; void BaseOption::Function()
{
cout<<"BaseOption::Function()"<<endl;
} class SubOption :
public BaseOption
{
public:
void Function();
}; void SubOption::Function()
{
cout<<"SubOption::Function()"<<endl;
} int _tmain(int argc, _TCHAR* argv[])
{
SubOption obj;
BaseOption *pBase = &obj;
SubOption *pSub = &obj;
pBase->Function();
pSub->Function();
}
输出:
BaseOption::Function()
SubOption::Function()
虽然实例对象时SubOption obj,但在调用时候 由BaseOption指针pBase会调进BaseOption中,这也是哦,SubOption is-a BaseOption .
c++ 子类切勿重新定义父类 non-virtual函数的更多相关文章
- c++ 切勿重新定义继承来的带缺省参数的函数
切勿重新定义继承来的带缺省参数的函数.我们知道,继承来的函数是virtual 的,至于原因在上一节中已经说明了,即“切勿重新定义父类non-virtual函数”.所以确切的描述应该是“切勿重新定义继承 ...
- C++ 子类继承父类纯虚函数、虚函数和普通函数的区别
C++三大特性:封装.继承.多态,今天给大家好好说说继承的奥妙 1.虚函数: C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现.子类可以重写父类的虚函数实现子类 ...
- C++虚函数表解析(图文并茂,非常清楚)( 任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法)good
C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技术 ...
- 父类指针指向子类内存,为什么当父类的成员函数不加virtual时,访问的还是父类的成员函数,而不是子类同名的成员函数
我认为是这样,类的成员函数都在代码区,不同的类的成员函数在代码区有自己的类名称空间限制,类的虚函数在虚函数表中,程序执行的时候,是先在虚函数表中找该成员函数,如果没有找到,就去该类在代码区的成员函数中 ...
- 转:C++:从子类访问父类的私有函数
众所周知,c和c++的数组都是不安全的,因为无论c还是c++都不提供数组边界检查功能,这使得数组溢出成为可能.从某个意义上说,c和c++是一种缺少监督的语言,然而这也正是其魅力所在.c++给予程序员更 ...
- 子类父类(虚函数下的 引用指针 对象)->看来没有子类指针这回事
#include<iostream> using namespace std; class Father { public: Father() { cout << " ...
- c++ 子类构造函数初始化及父类构造初始化
我们知道,构造方法是用来初始化类对象的.如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数:并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建. 构造函数与 ...
- ecshop设置一个子类对应多个父类并指定跳转url的修改方法
这是一篇记录在日记里面的技术文档,其实是对ecshop的二次开发.主要作用是将一个子类对应多个父类,并指定条跳转url的功能.ecshop是一款在线购物网站,感兴趣的可以下载源码看看.我们看看具体是怎 ...
- Linq:切勿使用 Count() > 0 来判断集合非空
原文(http://www.cnblogs.com/ldp615/archive/2011/12/11/2284154.html) Linq 出现之前,我们通常使用下面的方式来判断集合是否非空,即集合 ...
随机推荐
- 手动安装mysql-5.0.45.tar.gz
Linux下编译安装 安装环境:VMware9(桥接模式) + Linux bogon 2.6.32-642.3.1.el6.x86_64(查看linux版本信息:uname -a) 先给出MySQL ...
- AutoCAD2014的安装与激活
1.安装包与激活文件的下载 链接:https://pan.baidu.com/s/1I2-x9T__sQAgtvjkOyc_1Q 密码:5pd1 2.CAD的安装 此过程没什么特殊要求,安装时随便输入 ...
- NOIP模拟题 斐波那契数列
题目大意 给定长度为$n$序列$A$,将它划分成尽可能少的若干部分,使得任意部分内两两之和均不为斐波那契数列中的某一项. 题解 不难发现$2\times 10^9$之内的斐波那契数不超过$50$个 先 ...
- python爬虫框架Pyspider初次接触
pyspider网站地址:http://docs.pyspider.org/en/latest/.文档比较好,安装起来也非常方便.既然是基于python的框架,那么首先得安装python.微软出的一款 ...
- mysql_union all 纵向合并建表_20170123
年前事情比较多,博客不能每天更新了. 1.union all 纵向建表和left join 横向建表的数据结构区别 先贴代码 后面再补充 (#销售确认额 SELECT '05收货销售额' AS 标识, ...
- centos安装教程
centos7和6.x有很大的差别,在第一次安装的时候遇到了很多坑,一共安装了三次才成功 如果是用window自带的Hyper-v装centos时 安装包在\\10.10.10.1\ShareDo ...
- plsql Developer----plsql软件总结(待续更新)
如何查看数据库所有的表 打开pl/sql Developer连接上数据库了以后,在菜单 Tools 下面有个 Object browser 将其打勾(如果已经打勾了就不用管了),之后在IDE的左边有个 ...
- BZOJ4303:数列
浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...
- Oracle记录(一)Oracle简介与安装
Oracle笔记(一) Oracle简介及安装 一.轨迹 二.Oracle简介 Oracle是现在全世界最大的数据库提供商,编程语言提供商,应用软件提供商,它的地位等价于微软的地位. Oracle在古 ...
- Maven的Snapshot版本与Release版本
1. Snapshot版本代表不稳定.尚处于开发中的版本 2. Release版本则代表稳定的版本 3. 什么情况下该用SNAPSHOT? 协同开发时,如果A依赖构件B,由于B会更新,B应该使用SNA ...