一、同名隐藏

同名隐藏,即在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. java任务调度框架

    https://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/

  2. Shell脚本查询进程存活信息

    脚本代码如下: pid=`cat $2` function status_job(){ pcount=`ps -ef |grep $pid |grep -v grep |wc -l` if [ $pc ...

  3. php 数据集转换树、递归重组节点信息多维数组(转)

    一.将数据集转换成树 /** * 将返回的数据集转换成树 * @param array $list 数据集 * @param string $pk 主键 * @param string $pid 父节 ...

  4. Centos7常见问题及解决方法

    1,在Centos7中用MariaDB代替了mysql数据库 2,mysql报错:/usr/sbin/mysqld:unknown variable 'default-character-set=ut ...

  5. QGis C++ 开发之图层分类显示

    开发环境:Win10 + VS2010 + Qt 4.8.6 + QGis 2.14.4 简单介绍下如何用C++方式实现QGis中图层分类显示的方法. 要实现图层的分类显示主要会用到QgsCatego ...

  6. OpenCV——Mat类的创建、复制、函数

    Mat类的创建: 方法一: 通过读入一张图像,直接转换为Mat对象 Mat image = imread("test.jpg"); 其中 imread()方法需要传入String类 ...

  7. bat 传递超过10个参数(bat参数遍历)

    批处理文件中可引用的参数为%0~%9, %0是指批处理文件的本身,也可以说是一个外部命令:%1~%9是批处理参数,也称形参:而替换形参的实参若超过了批处理文件中所规定数值(9个)且想在批处理文件中应用 ...

  8. 2017-2018-2 20155203《网络对抗技术》 Exp8:Web基础

    基础问题回答 (1)什么是表单 我认为,form概念主要区分于table,table是用网页布局设计,是静态的,form是用于显示和收集信息传递到服务器和后台数据库中,是动态的: 以下是表单的百度百科 ...

  9. Java技术——String类为什么是不可变的

    0. 前言   如果一个对象,在它创建完成之后不能再改变它的状态,包括对象内的成员变量.基本数据类型的值等等.那么这个对象就是不可变的.众所周知String类就是不可变的.转载请注明出处为SEU_Ca ...

  10. [胡泽聪 趣题选讲]大包子环绕宝藏-[状压dp]

    Description 你有一个长方形的地图,每一个格子要么是一个障碍物,要么是一个有一定价值的宝藏,要么是一个炸弹,或者是一块空地.你的初始位置已经给出.你每次可以走到上.下.左.右这四个相邻的格子 ...