C++:同名隐藏和赋值兼容规则
一、同名隐藏
同名隐藏,即在C++的继承中,只要子类的函数名和父类的函数名相同,子类中的函数将会隐藏所有父类中和子类的成员函数同名的函数
特别注意:
和函数之间的重载不同,这里只要求函数的名字相同,而对函数的参数列表是否相同不做要求。话句话说父类中和子类的成员函数名相同但参数列表不同的成员函数也会被隐藏
示例:
#include<iostream>
using namespace std;
class Father{ //父类
public:
Father()=default;
Father(int v):value(v){}
void show(){
cout<<"调用Father类中的成员函数show()"<<endl;
}
void show(int a){
cout<<"调用Father类中的成员函数show(int)"<<endl;
}
private:
int value;
}; class Son:public Father{ //子类
public:
Son()=default;
Son(int v):value(v){}
void show(){ //对父类中的方法show()和方法show(int)进行了同名隐藏
cout<<"调用Son类中的成员函数show()"<<endl;
}
private:
int value;
}; int main(){
Son s;
s.show();
//s.show(1); //错误:方法show(int)被同名隐藏了
s.Father::show(); //父类的方法show()和方法show(int)确实被子类Son继承了,但被子类Son中的同名方法show()给隐藏了,无法通过子类的对象显式的调用
s.Father::show();
return ;
}
二、赋值兼容规则
所谓赋值兼容规则,即在任何需要基类对象的地方都可以用该基类的公有派生类的对象来代替,它主要包括以下情况:
• 派生类的对象可以赋值给基类的对象,此时的赋值操作主要是把派生类对象中所包含的对应基类的子对象赋值给基类对象
特别注意:
反过来(即将基类对象赋值给派生类对象)不行,因为派生类对象中的新成员将无值可赋
示意图:
示例:
#include<iostream>
using namespace std;
class Father{ //父类
public:
Father()=default;
Father(int value):father_value(value){}
void show(){
cout<<"Father类中的成员变量的值为:"<<father_value<<endl;
}
private:
int father_value;
}; class Son:public Father{ //子类
public:
Son()=default;
Son(int value):Father(value),son_value(value){}
void show(){
cout<<"Son类中的成员变量的值为:"<<son_value<<endl;
}
private:
int son_value;
}; int main(){
Father father();
Son son();
28 father=son; //将派生类对象赋值给基类对象
father.show();
return ;
}
• 可以将一个派生类对象的地址赋值给其基类的指针变量
特别注意:
1.只能通过该指针访问派生类中由基类继承来的隐藏对象,不能访问派生类中的新成员
2.此操作的本质是将指针指向派生类中由基类继承来的隐藏对象
3.不能将一个基类对象的地址赋值给一个派生类的指针变量
示意图:
示例:
#include<iostream>
using namespace std;
class Father{ //父类
public:
Father()=default;
Father(int value):father_value(value){}
void show(){
cout<<"Father类中的成员变量的值为:"<<father_value<<endl;
}
private:
int father_value;
}; class Son:public Father{ //子类
public:
Son()=default;
Son(int value):Father(value),son_value(value){}
void show(){
cout<<"Son类中的成员变量的值为:"<<son_value<<endl;
}
void new_func(){
cout<<"调用Son类中的成员方法:new_func()"<<endl;
}
private:
int son_value;
}; int main(){
Son son();
30 Father *ptr=&son;//将派生类对象的地址赋值给基类类型的指针
31 ptr->show();
32 //ptr->new_func(); //错误:只能通过该指针访问派生类中由基类继承来的隐藏对象,不能访问派生类中的新成员
return ;
}
• 派生类对象可以初始化基类的引用
特别注意:
1.只能通过该引用访问派生类中由基类继承来的隐藏对象,不能访问派生类中的新成员
2.此操作的本质是为派生类中由基类继承来的隐藏对象起一个别名
3.不能用基类对象来初始化派生类的引用
示意图:
示例:
#include<iostream>
using namespace std;
class Father{ //父类
public:
Father()=default;
Father(int value):father_value(value){}
void show(){
cout<<"Father类中的成员变量的值为:"<<father_value<<endl;
}
private:
int father_value;
}; class Son:public Father{ //子类
public:
Son()=default;
Son(int value):Father(value),son_value(value){}
void show(){
cout<<"Son类中的成员变量的值为:"<<son_value<<endl;
}
void new_func(){
cout<<"调用Son类中的成员方法:new_func()"<<endl;
}
private:
int son_value;
}; int main(){
Son son();
30 Father &father=son;//用派生类来初始化基类的引用
31 father.show();
32 //father.new_func(); //错误:只能通过该引用访问派生类中由基类继承来的隐藏对象,不能访问派生类中的新成员
return ;
}
C++:同名隐藏和赋值兼容规则的更多相关文章
- C++——同名隐藏 和 赋值兼容规则
同名隐藏 一旦子类定义了与父类同名的方法,则父类里面该名字的所有方法都被隐藏了.必须显示指定是父类的方法才可以 #include<iostream> using namespace std ...
- C++中的继承详解(3)作用域与重定义,赋值兼容规则
作用域与同名隐藏 一样的,先上代码 1 class A 2 { 3 public: 4 int a_data; 5 void a() 6 { 7 cout << "A" ...
- C++中的继承(3)作用域与重定义,赋值兼容规则
作用域与重定义(同名隐藏) 一样的,先上代码 1 class A 2 { 3 public: 4 int a_data; 5 void a() 6 { 7 cout << "A& ...
- C++中的继承(3)作用域与重定义,赋值兼容规则
1.作用域与重定义(同名隐藏) 一样的,先上代码 1 class A 2 { 3 public: 4 int a_data; 5 void a() 6 { 7 cout << " ...
- C++语言笔记系列之十六——赋值兼容规则&多继承的二义性
1.赋值兼容规则 (1)派生类对象能够给基类对象赋值,这样的情况下派生类对象将从基类继承的成员的值赋值给一个基类对象:可是不同意将一个基类的对象赋值给一个派生类. (2)能够将派生类对象的地址赋给基类 ...
- c++ 公有继承的赋值兼容规则
赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代.通过公有继承,派生类得到了基类中除构造函数.析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同.这样,公有派生 ...
- [c++]基类对象作为函数參数(赋值兼容规则)
编程处理教师的基本情况. 要求: 1.定义一个"person"类.用来存储及处理人的姓名.性别.年龄,成员函数自定: 2.定义"teacher"类,公有继承&q ...
- C++:基类与派生类对象之间的赋值兼容关系
4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量. ...
- C++赋值兼容原则
C++赋值兼容原则(派生类对象是基类对象,反之不成立) –基类指针强制转换成派生类指针 –派生类中重定义基类成员(同名覆盖) 假设, 一个基类 "普通人", 一个派生类 " ...
随机推荐
- BZOJ4340:[BJOI2015]隐身术(后缀数组,ST表,DFS)
Description 给定两个串A,B.请问B中有多少个非空子串和A的编辑距离不超过K? 所谓“子串”,指的是B中连续的一段.不同位置的内容相同的子串算作多个. 两个串之间的“编辑距离”指的是把一个 ...
- Spark2.3文档翻阅的一点简略笔记(WaterMarking)
写本文原因是之前已经将官网文档阅读过几遍,但是后来工作接触spark机会较少所以没有跟进新特性,利用周末一点闲暇时间粗略阅读一篇,将自己之前遇见过的问题解决过的问题印象不深刻的问题做一下记录. 1关于 ...
- PHP 使用 jwt 方式用户身份认证
封装类 // +---------------------------------------------------------------------- // | Created by PhpSt ...
- Python2.7-dbm、gdbm、dbhash、bsddb、dumbdb
dbm.gdbm.dbhash.bsddb.dumbdb模块,都是操作数据库文件的模块,打开后都会返回对应数据库类型对象,类似字典,有许多操作和字典操作相同,键和值都是以字符串形式保存.dbm 是简单 ...
- JAVA框架 Spring AOP注解
一.准备工作: 1)导入jar包: 4个jar包. 2)约束:(spring需要所有的约束)有IOC约束和AOP 还有事务(tx)以及注解注入的约束(context). <?xml versio ...
- 将如下三组不同类型的数据利用DataInputStream和DataOutputStream写入文件,然后从文件中读出
三组数据如下: {19.99 , 9.99 , 15.99 , 3.99 , 4.99} {12 , 8 , 13 ,29 ,50} {"Java T-shirt" , " ...
- HDU 3592 World Exhibition(线性差分约束,spfa跑最短路+判断负环)
World Exhibition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- jquery获取具有多个类class的标签内容
var tag = $('div.firstClassName.secondClassName.thirdClassName'); 注意空格
- VBA 上传数据与查找数据 while循环 和 for循环
Option Explicit 上传数据Private Sub CommandButton1_Click() If MsgBox("请确认数据是否准确,是否确认上传?", vbC ...
- 20155202张旭 Exp5 MSF基础应用
20155202张旭 Exp5 MSF基础应用 实践内容 本次实验我使用的攻击方式: 1.针对office软件的主动攻击:--MS10-087: 2.MS10-002漏洞对浏览器攻击 3.针对客户端的 ...