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++赋值兼容原则(派生类对象是基类对象,反之不成立) –基类指针强制转换成派生类指针 –派生类中重定义基类成员(同名覆盖) 假设, 一个基类 "普通人", 一个派生类 " ...
随机推荐
- 最好用的jquery列表拖动排列(由项目提取)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wuchengzeng/article/details/31766235 最好的jquery列表拖动排 ...
- 有意思的flex 色子布局
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- bip39
BIP: 39 (助记词) Layer: Applications Title: Mnemonic code for generating deterministic keys Author: Mar ...
- day3-作业及答案
作业:1.用python实现冒泡排序# [50,20,30,10]## 升序:谁大谁交换到后面# 降序:谁大谁交换到前面## 以升序为例# 第1趟:# [20,50,30,10]# [20,30,50 ...
- Python2.7-stat
stat模块,用于解释 os.stat(),os.lstat(),os.fstat() 返回的结果,定义了许多表示文件或路径的各个状态的常数和测试各个状态的函数具体参考 官方文档 和 http://w ...
- 编写陈旭,实现通过字符型变量创建boolean值,再将其转换为字符串输出,观察输出后的字符串与创建Boolean对象时给定的参数是否相等.
主要涉及到基本数据类型与包装类的转换. Boolean类的tostring方法的作用,返回一个表示该布尔值的 String 对象 public class Test1 { public static ...
- websocket python实现原理
""" pip install ws4py """ import json from ws4py.client.threadedclient ...
- P2157 [SDOI2009]学校食堂Dining
题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...
- jqgrid 宽度自适应
当jqgrid所在操作区宽度大于了给各列设置宽度之和时,此时表格的宽度未铺满操作区,效果不理想 此时,可以通过配置宽带自适应来现实表格内容自动铺满. 配置属性 shrinkToFit:ture 若要启 ...
- [Jsoi2016]最佳团体 BZOJ4753 01分数规划+树形背包/dfs序
分析: 化简一下我们可以发现,suma*ans=sumb,那么我们考虑二分ans,之后做树形背包上做剪枝. 时间复杂度证明,By GXZlegend O(nklogans) 附上代码: #includ ...