C++ 派生类覆盖重载基类函数
派生类希望基类重载函数可见,情况有三种:
a)派生类中覆盖某个版本,则某个版本可见,全部都覆盖重写,则全部版本可见。
b)派生类中一个也不覆盖,则全部基类版本可见。
c)派生类需要添加新的重载版本,同时又需要可见基类的重载版本,此时并不是必须全部覆盖重写全部版本。可在派生类中用using声明基类重载的函数。
说明:对派生类没有重新定义的重载版本的访问实际上是对using声明点的访问。
两种注意点:
a)指向派生类的基类指针或引用,不可调用派生类中的重载函数。
原因:静态编译名字查找先于类型检查,在基类中找到同名函数,就不喊在派生类中继续找,而基类不存在目标调用形式的函数
b)若不用using声明基类的重载版函数,派生类对象不可调用基类的重载版本。
原因:派生类的函数,隐藏了基类的同名函数。
h----------------------
#ifndef DEMOCLASS_H
#define DEMOCLASS_H #include <iostream>
using namespace std; class DemoClass
{
public:
DemoClass();
void func(int);
void func(char);
}; class DerivedClass:public DemoClass
{
public:
using DemoClass::func;
void func(string);
}; #endif // DEMOCLASS_H cpp---------------------------
#include "democlass.h" DemoClass::DemoClass()
{
cout<<"construct..."<<endl;
} void DemoClass::func(int)
{
cout<<"DemoClass func(int)..."<<endl;
} void DemoClass::func(char)
{
cout<<"DemoClass func(char)..."<<endl;
} void DerivedClass::func(string)
{
cout<<"DerivedClass func(string)..."<<endl;
} main----------------------
#include <QCoreApplication>
#include "democlass.h" int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); DemoClass *demo;
DerivedClass derived;
demo = &derived; cout<<"...Demo object that point to Derived access func..."<<endl;
demo->func();
demo->func('a'); cout<<endl<<"...derived object access func..."<<endl;
derived.func();
derived.func('a');
derived.func("abc");
return a.exec();
} 运行结果--------------------
construct...
...Demo object that point to Derived access func...
DemoClass func(int)...
DemoClass func(char)... ...derived object access func...
DemoClass func(int)...
DemoClass func(char)...
DerivedClass func(string)...
C++ 派生类覆盖重载基类函数的更多相关文章
- C++ - 派生类访问模板基类(templatized base class)命名
派生类访问模板基类(templatized base class)命名 本文地址: http://blog.csdn.net/caroline_wendy/article/details/239936 ...
- 派生类地址比基类地址少4(子类与基类指针强行转换的时候,值居然会发生变化,不知道Delphi BCB是不是也这样) good
大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree ...
- C++ - 派生类强制转换为基类
派生类强制转换为基类 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24268821 在多态的使用时, 派生类的指针或引用能够转换 ...
- C#在派生类中调用基类成员
一.在派生类中调用基类成员 在C#的派生类中,我们可以使用base关键字调用基类中的公有或者受保护成员.这些成员只能是构造函数.实例方法或者实例属性. base关键字调用基类成员的语法格式如下: ba ...
- 派生类地址比基类地址少4(CDerived对象的起始地址存放的是虚表指针vptr,也就是子类的第一项内容。接下来的是基类的成员变量,接下来再是自身的成员变量)
大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree ...
- C#派生类中使用基类protected成员的方法
我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被prot ...
- C++ 继承 - 在派生类中对基类初始化
构造函数与基类的其他成员不同,不能被派生类继承,因此为了初始化基类中的成员变量,需要在派生类中调用基类的构造函数(即显式调用),如果派送类没有调用则默认调用基类的无参构造函数(即隐式调用). 显式调用 ...
- cc31a_demo--CppPrimer_静态成员与继承-在派生类中访问基类中的static成员的方法
//*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针 ...
- C++//菱形继承 //俩个派生类继承同一个基类 //又有某个类同时继承俩个派生类 //成为 菱形继承 或者 钻石 继承//+解决
1 //菱形继承 2 //俩个派生类继承同一个基类 3 //又有某个类同时继承俩个派生类 4 //成为 菱形继承 或者 钻石 继承 5 6 #include <iostream> 7 #i ...
随机推荐
- Peewee之playhouse中的数据库连接池
参见 http://note.youdao.com/noteshare?id=104255d91b5a00d716a713ae36e911fd 目前在学习Python库的源码,这是第二篇,比较简单的功 ...
- Java匹马行天下之JavaSE核心技术——反射机制
Java反射机制 一.什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及 ...
- SpringBoot 打包成war
1.修改pom.xml文件 <packaging>war</packaging> <properties> <project.build.sourceEnco ...
- 用友U9 刷新当前页面代码
this.Action.NavigateAction.Refresh(null, true);//刷新当前页
- loadrunner11 您不具有该 Vuser 类型的许可证. 请与 HP Software 联系以更新许可证.
您不具有该 Vuser 类型的许可证. 请与 HP Software 联系以更新许可证. 在loadrunner11 执行发生报错: 打开loadrunner软件首页,点击配置-->loadru ...
- css+js实现自动伸缩导航栏
用css+js实现自动伸缩导航栏 需要达到的效果: 默认首页选中样式 设置鼠标滑过效果:颜色变化(#f60),宽度变化,字体变化 所涉及的知识点: 布局:float css: 元素状态切换(displ ...
- PIE 插件式开发小笔记__PIESDK学习体会
基于PIE.NET-SDK插件式二次开发文档笔记: PIE 插件式开发配置文件: 它里面一行如下: 理解上一行'Item'关系-> library:为插件类名(程序集名称+后缀 ...
- Delphi中destroy, free, freeAndNil, release用法和区别
Delphi中destroy, free, freeAndNil, release用法和区别 1)destroy:虚方法 释放内存,在Tobject中声明为virtual,通常是在其子类中overri ...
- QT POST/GET HTTP操作
工程文件 Qt += network 举例 Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui-> ...
- swagger页面详细讲解