c/c++ 继承与多态 子类隐藏父类的同名非虚函数
问题1:若类A里有公有成员方法int fcn(),类B公有继承类A,并类B里有公有成员方法int fcn(int),可以在用户代码里,用类B的对象调用类A的int fcn()吗??
不可以,编译出错,提示类B里没有int fcn()。
是不是感觉很奇怪,类B公有继承了类A,按理说,类A的公有成员,是可以通过类B的对象来调用的。
原因是:子类重载了父类的int fcn(),注意是名字相同,参数不一样。结果导致,对于类B的对象来说,隐藏了父类A的同名方法int fcn()
#include <iostream>
class Base{
public:
virtual int fcn(){
std::cout << "base fcn()" << std::endl;
}
};
class D1 : public Base{
public:
int fcn(int){//形参与Base的fcn不一致,所以隐藏了Base的fcn
std::cout << "D1 fcn(int)" << std::endl;
}
virtual void f2(){
std::cout << "D1 f2()" << std::endl;
}
};
class D2 : public D1{
public:
int fcn(int){//隐藏了D1::fcn(int)
std::cout << "D2 fcn(int)" << std::endl;
}
int fcn(){//覆盖了Base的虚函数fcn
std::cout << "D2 fcn()" << std::endl;
}
void f2(){//覆盖了D1的虚函数f2
std::cout << "D2 f2()" << std::endl;
}
};
int main(){
Base b;
D1 d1;
D2 d2;
//原因是:子类重载了父类的int fcn(),注意是名字相同,参数不一样。结果导致,对应类B的对象来说,隐藏了父类A的同名方法int fcn()
d1.fcn();//error,不可以,编译出错,提示类B里没有int fcn()。
}
修改方法:使用using
class D1 : public Base{
public:
using Base::fcn;//使用using后,就把Base里的,所有fcn为名字的成员方法,都引入到D1里面,所以就可以使用D1的对象来调用Base里的任何fcn为名字的成员方法了。
int fcn(){
std::cout << "D1 fcn()" << std::endl;
}
int fcn(int){//形参与Base的fcn不一致,所以隐藏了Base的fcn
std::cout << "D1 fcn(int)" << std::endl;
}
virtual void f2(){
std::cout << "D1 f2()" << std::endl;
}
};
问题2:若Base里有多个fcn方法(名字相同,参数不一样),那么如果在Base的子类,只打算覆盖某个Base的fcn方法,而且还想让Base类里其他没有被覆盖的fcn方法也可以被调用,那应该怎么办?
办法1:在子类里覆盖所有Base的fcn方法,在方法体里,直接调用Base::fcn,但是这样太麻烦了,每一个都要覆盖。有没有好的办法?
办法2:使用using。只需要在子类的public下,using Base::fcn,就达到了办法1的效果。
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
c/c++ 继承与多态 子类隐藏父类的同名非虚函数的更多相关文章
- 读书笔记 effective c++ Item 36 永远不要重新定义继承而来的非虚函数
1. 为什么不要重新定义继承而来的非虚函数——实际论证 假设我告诉你一个类D public继承类B,在类B中定义了一个public成员函数mf.Mf的参数和返回类型并不重要,所以假设它们都是void. ...
- c++ 子类,基类 中this指针 虚函数使用
笔记: 子类和基类 构造函数不显式时,的this指针相同..在QT中,如果父类基于QObject,那么构造子类时传入this指针,这样所有子类,父类,基类都是同一地址.delelater(),会del ...
- C++ 学习笔记 (六) 继承- 子类与父类有同名函数,变量
学习了类的继承,今天说一下当父类与子类中有同名函数和变量时那么程序将怎么执行.首先明确当基类和子类有同名函数或者变量时,子类依然从父类继承. 举例说明: 例程说明: 父类和子类有同名的成员 data: ...
- public、potected 、private继承下的子类对父类成员的访问情况
#include<iostream> #include<string> using namespace std; class parent{ protected: int m_ ...
- 《effective C++》:条款36——绝不重新定义继承而来的非虚函数
(1)当派生类中重写了基类的非虚函数时,这个时候这个函数发生的是静态绑定 下面中的代码中: 定义一个基类B,基类定义了函数fcm,fcm是非虚的函数. 定义一个派生类D,派生类重新定义了fcm. 当用 ...
- C#中子类对基类方法的继承、重写和隐藏
提起子类.基类和方法继承这些概念,肯定大家都非常熟悉.毕竟,作为一门支持OOP的语言,掌握子类.基类是学习C#的基础.不过,这些概念虽然简单,但是也有一些初学者可能会遇到的坑,我们一起看看吧. 子 ...
- Java:[面向对象:继承,多态]
本文内容: 继承 多态 首发时期:2018-03-23 继承: 介绍: 如果多个类中存在相同的属性和行为,可以将这些内容抽取到单独一个类中,那么多个类(子类)无需再定义这些属性和行为,只要继承那个类( ...
- C++ 多态、虚函数、虚析构函数
1.若某种语言只支持类但不支持多态,则只能称为基于对象,不能说是面向对象. 2.多态:向不同对象发送同一个消息,不同的对象会产生不同的行为,发送消息可以是调用函数等操作.函数重载.运算符重载都是多态. ...
- OC的封装、继承与多态
面向对象有三大特征:封装.继承和多态. 一.封装 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问.简而言之,信息隐藏,隐 ...
随机推荐
- 关于scrollTop获取卷曲距离的三种方式- --兼容代码如下
对于不同浏览器而言--获取卷曲距离方式可能有所不一样---下面提供三种方式--- scrollTop1 = window.pageYoffset || document.documentElement ...
- Python 工厂函数和内建函数
工厂函数 工厂函数都是类对象, 即当你调用他们时, 创建的其实是一个类实例 例如: str(), list(), tuple()... 内建函数 内建函数通常是python自定义的一些函数, 这些函数 ...
- 华为oj之字符个数统计
题目:字符个数统计 热度指数:4720 时间限制:1秒 空间限制:32768K 本题知识点: 字符串 题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127). ...
- 一个JavaWeb搭建的开源Blog系统,整合SSM框架
搬砖有暇,捣鼓了一个简单的Blog系统(项目地址https://github.com/lenve/JavaEETest/tree/master/MyBlog),适合以下人群学习: 1.已经掌握了jsp ...
- LogDashboard 1.0.4 版本发布
LogDashboard 1.0.4 版本 有关LogDashboard的介绍请看这里.logDashboard已经发布了1.0.4版本 有关这个版本的详细变化可以在Github上的里程碑上查看 支持 ...
- Docker折腾手记-安装
安装 docker红的发紫,所以博主耳闻这么久,也要来折腾折腾了 研究不多,个人目前认为docker给我们带来了以下好处 开发机器因为开发原因,需要配置各种各校的环境,繁琐且耗费资源.配来配去还容易环 ...
- HashMap,HashTable,ConcurrentHashMap异同比较
0. 前言 HashMap和HashTable的区别一种比较简单的回答是: (1)HashMap是非线程安全的,HashTable是线程安全的. (2)HashMap的键和值都允许有null存在,而H ...
- Java开发知识之Java中的集合上List接口以及子类讲解.
Java开发知识之Java中的集合类 一丶什么是集合类 如果你学习说数据结构,那么学习集合就很简单. 因为集合就是存储数据的结构. 例如 有链表结构 (list ) 还有 map结构.等等. 集合类就 ...
- [三]基础数据类型之Integer详解
Integer 基本数据类型int 的包装类 Integer 类型的对象包含一个 int 类型的字段 属性简介 值为 2^31-1 的常量,它表示 int 类型能够表示的最大值 @N ...
- Zabbix3.0基础教程之二:item、trigger、action、graph配置
一.Zabbix监控报警过程 在一次完整的Zabbix配置中,需要涉及到的术语有以下几项: 1.host groups:主机组,按生产需求将功能类别相近或相同的主机进行分组,便于管理. 2.host: ...