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++赋值兼容原则(派生类对象是基类对象,反之不成立) –基类指针强制转换成派生类指针 –派生类中重定义基类成员(同名覆盖) 假设, 一个基类 "普通人", 一个派生类 " ...
随机推荐
- ECStore图片云端集群存储实践-又拍云存储
通过又拍云存储REST API ,为ECStore新增图片存储引擎,从而达到图片数据与主站数据分离.提高网站性能. 图片存储引擎相关文件添加与修改 一共涉及到ECStore 2个APP 的文件添加和修 ...
- python 之 string() 模块
common string oprationsimport string1. string constants(常量) 1) string.ascii_letters The concat ...
- python第三十六课——2.迭代器对象
满足前提: 1).必须是一个可迭代对象 2).可以被next()所作用的 举例: generator... 高效的检测一个对象是否是迭代器对象 需要使用collections模块中的Iterator类 ...
- STM32学习之路-LCD(2)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011791262/article/details/27711881 这些天一直在研究LCD的初始化 ...
- 容器内部设置JVM的Heap大小
容器内部利用脚本来获取容器的CGroup资源限制,并通过设置JVM的Heap大小. Docker1.7开始将容器cgroup信息挂载到容器中,所以应用可以从 /sys/fs/cgroup/memory ...
- 20145236《网络对抗》Exp1 逆向及Bof基础
20145236<网络对抗>Exp 1逆向及Bof基础 一.实践目标 运行原本不可访问的代码片段 强行修改程序执行流 以及注入运行任意代码. 二.基础知识及实践准备 理解EIP寄存器及其功 ...
- centos6.5 64位静默安装oracle 10G R2
操作系统:CentOS release 6.5 (Final) 64位 oracle版本:Oracle Database 10g Enterprise Edition Release 10.2.0.1 ...
- PAT B1029 旧键盘 (20 分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及 ...
- css中的莫名空白间隙
此时div和img直接有空白,在他们父元素设置font-size:0;就可以解决了
- Android源代码下载以及异常查找网站推荐
源代码下载:https://github.com/ 异常查找:http://stackoverflow.com/