c++ 公有继承的赋值兼容规则
赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有
成员,而且所有成员的访问控制属性也和基类完全相同。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。赋
值兼容规则中所指的替代包括以下的情况:
1>派生类的对象可以赋值给基类对象。
2>派生类的对象可以初始化基类的引用。
3>派生类对象的地址可以赋给指向基类的指针。
在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。 示例如下:
#include "stdafx.h"
#include <iostream>
using namespace std; class birds //基类
{
public:
void Speaking()
{
cout << "......" << endl;
}
}; class owl : public birds //子类
{
public:
void Speaking()
{
cout << "HOOT! HOOT! " << endl;
}
}; int main()
{
birds b0;
owl b1;
owl b2; b0 = b2; //子类的对象可以赋给基类的对象
b0.Speaking(); birds &br = b1; //子类的对象可以初始化基类的引用
br.Speaking(); birds *pt = &b1; //子类的对象的地址可以赋给指向基类的指针
pt->Speaking(); return ;
}
输出结果:

由运行结果可知,当派生类的对象当成基类的对象使用时,调用的都是基类的成员函数和数据成员;
当birds中的Speaking用virtual修饰时,输出结果会是怎样的呢?
#include "stdafx.h"
#include <iostream>
using namespace std; class birds //基类
{
public:
virtual void Speaking()
{
cout << "......" << endl;
}
}; class owl : public birds //子类
{
public:
virtual void Speaking()
{
cout << "HOOT! HOOT! " << endl;
}
}; int main()
{
birds b0;
owl b1; b0 = b1; //子类的对象可以赋给基类的对象
b0.Speaking(); birds &br = b1; //子类的对象可以初始化基类的引用
br.Speaking(); birds *pt = &b1; //子类的对象的地址可以赋给指向基类的指针
pt->Speaking(); return ;
}
输出结果:

注意:
c++ 公有继承的赋值兼容规则的更多相关文章
- 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++的继承中,只要子类的函数名和父类的函数名相同,子类中的函数将会隐藏所有父类中和子类的成员函数同名的函数 特别注意: 和函数之间的重载不同,这里只要求函数的名字相同,而 ...
- C++——同名隐藏 和 赋值兼容规则
同名隐藏 一旦子类定义了与父类同名的方法,则父类里面该名字的所有方法都被隐藏了.必须显示指定是父类的方法才可以 #include<iostream> using namespace std ...
- [c++]基类对象作为函数參数(赋值兼容规则)
编程处理教师的基本情况. 要求: 1.定义一个"person"类.用来存储及处理人的姓名.性别.年龄,成员函数自定: 2.定义"teacher"类,公有继承&q ...
- C++:基类与派生类对象之间的赋值兼容关系
4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量. ...
- 【C++札记】赋值兼容
赋值兼容的规则时在需要使用基类对象的任何地方都可以使用公有派生类对象来替代.公有继承派生类可获得基类中除构造函数,析构函数外的所有成员,能用基类解决的问题,派生类也能解决.更直白点说,如果一个类是从一 ...
随机推荐
- spark优化系列一:参数介绍
1 spark on yarn常用属性介绍 属性名 默认值 属性说明 spark.yarn.am.memory 512m 在客户端模式(client mode)下,yarn应用master使用的内存数 ...
- FireDAC 连接Access (accdb)数据库
FireDAC可以方便连接数据库,但是要连接新版本的accdb数据库,要注意这样的事项(以Office2010版为例) 安装Office2010 x86版,注意,不能安装x64版,因为Delphi I ...
- Java集合类面试题
java.util包中包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式. 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最 ...
- Python的异常
一.异常的常用形式 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行.一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当Pyth ...
- linux的常用易忘命令
1.查看软件安装路径 [root@localhost ~]# which gcc /usr/bin/gcc 查询进程 ps -ef |grep redis 查看端口 netstat -lntp |g ...
- .NET基础知识之七——索引器
索引器是什么?有什么作用?索引器允许类的实例以访问数组的形式来访问对象里面的属性.如我们经常可以看到类似于dr["name"]="test",或者 ...
- NSDictionary底层实现原理
一言以蔽之:在OC中NSDictionary是使用hash表来实现key和value的映射和存储的. 那么问题来了什么是hash表呢? 哈希表(hash表): 又叫做散列表,是根据关键码值(key v ...
- 领扣[LeetCode]从零开始[使用C++][1,10]
0.序 以后不做后端开发是不是就用不到C++了?真香.话不多说,我已经躺倒在第一题上了.不贴题目了,持续更新. 1.两数之和 原文:https://www.cnblogs.com/grandyang/ ...
- lintcode-108-分割回文串 II
108-分割回文串 II 给定一个字符串s,将s分割成一些子串,使每个子串都是回文. 返回s符合要求的的最少分割次数. 样例 比如,给出字符串s = "aab", 返回 1, 因为 ...
- 6for Java
class Check{ public boolean validate(String name, String password){ if(name.equals("xuzhaoni ...