C++中继承关系中的同名隐藏和对策
在C++及其面向对象的理论中,有这样的场景:一个类继承自另外一个类,如果这两个类都有一个函数名和参数及其返回值一样的成员函数,那么子类的函数会自动将父类对应的函数隐藏。即同名隐藏。在有时的开发过程中,我们却希望子类的成员函数和父类的成员函数均要执行。那么就需要在子类的成员函数中,显式地对父类同名的成员函数进行调用。
下面的例子即演示了同名隐藏的概念和避免同名隐藏的方法。
#include <iostream> using namespace std; class BaseClass
{
public:
BaseClass()
{
cout << "BaseClass::BaseClass()\t" << this << endl;
}
~BaseClass()
{
cout << "BaseClass::~BaseClass()\t" << this << endl;
} void ShowMsg()
{
cout << "BaseClass::ShowMsg()\t" << this << endl;
} void ShowMsg2()
{
cout << "BaseClass::ShowMsg2()\t" << this << endl;
}
}; class SubClassA: public BaseClass
{
public:
SubClassA()
{
cout << "SubClassA::SubClassA()\t" << this << endl;
} ~SubClassA()
{
cout << "SubClassA::~SubClassA()\t" << this << endl;
} void ShowMsg()
{
BaseClass::ShowMsg();
cout << "SubClassA::ShowMsg()\t" << this << endl;
} void ShowMsg2()
{
cout << "SubClassA::ShowMsg2()\t" << this << endl;
}
}; int main(int argc, char *argv[])
{
cout << "process begin at\t" << (void*) &main << endl;
SubClassA subClassA;
cout << "隐藏基类成员的测试" << endl;
subClassA.ShowMsg2();
cout << "=====显式调用被隐藏的基类成员的测试========" << endl;
subClassA.ShowMsg();
cout << "======end test=========" << endl; return 0;
}
程序的日志:
process begin at 0x401a65
BaseClass::BaseClass() 0x62feee
SubClassA::SubClassA() 0x62feee
隐藏基类成员的测试
SubClassA::ShowMsg2() 0x62feee
=====显式调用被隐藏的基类成员的测试========
BaseClass::ShowMsg() 0x62feee
SubClassA::ShowMsg() 0x62feee
======end test=========
SubClassA::~SubClassA() 0x62feee
BaseClass::~BaseClass() 0x62feee
C++中继承关系中的同名隐藏和对策的更多相关文章
- JavaSE复习日记 : 继承关系和super关键字以及继承关系中方法的覆写
/* * 类的继承和super关键字 * * 软件开发的三大目的: * 可拓展性; * 可维护性; * 可重用性; * * 这里单说下可重用性这一项: * 为了代码复用,复用方式有: * 函数的调用复 ...
- C#继承关系中【方发表】的创建和调用
—C#继承关系中[方发表]的创建和调用 Insus.NET实现一个最炫最原创的验证码.你可以从下面的一步一步的演译. 实现一个验证码,需要了解的是,它最基本是随机产生字符串:<在ASP.NET ...
- 解惑《你必须知道的.net》——C#继承关系中【方发表】的创建和调用
前言: 现在正在读<你必须知道的.net>(第二版)一书,看到IL语言那一章,将call.callvirt和calli时候,书中举了一个例子,是一个三层继承的例子,我一开始看的时候就有点懵 ...
- Java类继承关系中的初始化顺序
Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...
- java中继承关系学习小结
继承:把多个类中同样的内容提取出来.定义到一个类中,其它类仅仅须要继承该类.就能够使用该类公开的属性和公开的方法. 继承的优点:提高代码的复用性.提高代码的可维护性.让类与类之间产生关系,是多态存 ...
- 不同包中继承关系访问protected内部类问题
有两个包pack1和pack2,pack1中是父类,pack2中子类继承自pack1中的父类.这里主要探索一下子类访问父类中protected内部类的问题: 第一个类: package pack1; ...
- 继承关系中子类使用@Data注解问题
HashSet中使用@Data注解问题 平时习惯使用lombok工具,免去了我们写get.set方法之类的,当然了,我们使用@Data注解后,equals().hashCode().toString( ...
- java继承关系中成员变量,构造方法,成员方法的关系
Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单写那个名字就访问那个名字! b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子 ...
- Java 中的多态,一次讲个够之继承关系中的多态
多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一个 ...
随机推荐
- Spring @Qualifier l转
当候选 Bean 数目不为 1 时的应对方法 在默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个.当找不到一个匹配的 Bean ...
- eclipse中自动加载源码的方法
1.选中项目右键properties--java build path--Libraries--Add External class Folder 找到项目将项目添加进去 2.然后就是这样 3.OK
- Django---自定义admin组件思维导图
- 基于Bootstrap的jQuery登录表单
在线演示 本地下载
- Docker_remote_api未授权访问漏洞
docker remote api主要的目的是取代命令行界面, docker client和docker daemon通过unix domain socket进行通信. 默认情况下,只有本机的roo ...
- React Native之持久化存储(AsyncStorage、react-native-storage)的使用
AsyncStorage是一个简单的.异步的.持久化的Key-Value存储系统,它对于App来说是全局性的.这是官网上对它的介绍.可以知道,这个asyncstorage也是以键值对的形式进行存储数据 ...
- Spring_通过工厂方法配置 Bean
beans-factory.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns=&q ...
- MongoDB快速入门(十一)- sort() 方法
sort() 方法 要在 MongoDB 中的文档进行排序,需要使用sort()方法. sort() 方法接受一个文档,其中包含的字段列表连同他们的排序顺序.要指定排序顺序1和-1. 1用于升序排列, ...
- [BZOJ2815]灾难
题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物的阿米巴告 ...
- Autofac property injection
https://autofaccn.readthedocs.io/en/latest/register/prop-method-injection.html Property and Method I ...