一、同名隐藏

同名隐藏,即在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++:同名隐藏和赋值兼容规则的更多相关文章

  1. C++——同名隐藏 和 赋值兼容规则

    同名隐藏 一旦子类定义了与父类同名的方法,则父类里面该名字的所有方法都被隐藏了.必须显示指定是父类的方法才可以 #include<iostream> using namespace std ...

  2. C++中的继承详解(3)作用域与重定义,赋值兼容规则

    作用域与同名隐藏 一样的,先上代码 1 class A 2 { 3 public: 4 int a_data; 5 void a() 6 { 7 cout << "A" ...

  3. C++中的继承(3)作用域与重定义,赋值兼容规则

    作用域与重定义(同名隐藏) 一样的,先上代码 1 class A 2 { 3 public: 4 int a_data; 5 void a() 6 { 7 cout << "A& ...

  4. C++中的继承(3)作用域与重定义,赋值兼容规则

    1.作用域与重定义(同名隐藏) 一样的,先上代码 1 class A 2 { 3 public: 4 int a_data; 5 void a() 6 { 7 cout << " ...

  5. C++语言笔记系列之十六——赋值兼容规则&amp;多继承的二义性

    1.赋值兼容规则 (1)派生类对象能够给基类对象赋值,这样的情况下派生类对象将从基类继承的成员的值赋值给一个基类对象:可是不同意将一个基类的对象赋值给一个派生类. (2)能够将派生类对象的地址赋给基类 ...

  6. c++ 公有继承的赋值兼容规则

    赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代.通过公有继承,派生类得到了基类中除构造函数.析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同.这样,公有派生 ...

  7. [c++]基类对象作为函数參数(赋值兼容规则)

    编程处理教师的基本情况. 要求: 1.定义一个"person"类.用来存储及处理人的姓名.性别.年龄,成员函数自定: 2.定义"teacher"类,公有继承&q ...

  8. C++:基类与派生类对象之间的赋值兼容关系

    4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量. ...

  9. C++赋值兼容原则

    C++赋值兼容原则(派生类对象是基类对象,反之不成立) –基类指针强制转换成派生类指针 –派生类中重定义基类成员(同名覆盖) 假设, 一个基类 "普通人", 一个派生类 " ...

随机推荐

  1. python爬虫(二)

    python爬虫之urllib 在python2和python3中的差异 在python2中,urllib和urllib2各有各个的功能,虽然urllib2是urllib的升级版,但是urllib2还 ...

  2. console.time方法与console.timeEnd方法

    在Node.js中,当需要统计一段代码的执行时间时,可以使用console.time方法与console.timeEnd方法,其中console.time方法用于标记开始时间,console.time ...

  3. mpvue使用vant Weapp运行npm run build命令打包后失效

    最近在使用mpvue开发微信小程序,在开发过程中使用有赞的小程序ui框架—— vant Weapp ,至于如何使用在我个人博客中有一篇关于如何使用vant Weapp ,需要的同学请点进这里自行查看. ...

  4. 基于TP5使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯

    https://www.cnblogs.com/wt645631686/p/7366924.html 前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交 ...

  5. 高斯-克吕格投影与UTM投影

    高斯-克吕格投影与UTM投影 高斯-克吕格(Gauss-Kruger)投影与UTM投影(Universal Transverse Mercator,通用横轴墨卡托投影)都是横轴墨卡托投影的变种,目前一 ...

  6. C++与C#互调dll的实现步骤

    这篇文章主要介绍了C++与C#互调dll的实现步骤,dll动态链接库的共享在一些大型项目中有一定的应用价值,需要的朋友可以参考下 本文实例展示了C++与C#互调dll的实现步骤,在进行大型项目共享dl ...

  7. PAT A1004 Counting Leaves (30 分)——树,DFS,BFS

    A family hierarchy is usually presented by a pedigree tree. Your job is to count those family member ...

  8. C++ 虚函数的使用

    虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: #include <iostream> using na ...

  9. 【webstorm】免费使用

    http://idea.imsxm.com/       测试过ok 后期追加(20180316更新为) http://idea.codebeta.cn/ 后期追加(20180502更新为) http ...

  10. 【LeeCode23】Merge k Sorted Lists★★★

    1.题目描述: 2.解题思路: 题意:将K个已经排序的链表合并成一个排序的链表,分析并描述所用算法的复杂度. 方法一:基于“二分”思想的归并排序.本文用非递归和递归两种方法实现. (1)非递归:归并排 ...