c++ 基类,派生类的类型兼容性
#include <iostream>
using namespace std;
class CFather
{
public:
void display() const { cout<<"CFather::display()"<<endl;}
};
class CSon:public CFather
{
public:
void display() const { cout<<"CSon::display()"<<endl;}
};
class CGrandSon:public CSon
{
public:
void display() const { cout<<"CGrandSon::display()"<<endl;}
};
void show(CFather *ptr)
{
ptr->display();
}
void showson(CSon *ptr)
{
ptr->display();
}
int main()
{
CFather father;
CSon son;
CGrandSon grandson;
show(&father);
show(&son);
show(&grandson);
showson(&grandson); getchar();
return ; }
输出结果:

类型兼容原则:可以将派生类对象的地址赋值给基类
结论:但是通过这个基类类型的指针,却只能访问到从基类继承的成员。
作用效果:基类对象出现的场合作用派生类对象进行替代后,派生类仅仅发挥出基类的作用。
下面改一下代码,访问数据成员:
#include <iostream>
using namespace std;
class CFather
{
public:
CFather():iTest(){}//构造函数成员初始化
void display() const { cout<<"CFather::display()"<<iTest<<endl;}//包含iTest
int iTest;
};
class CSon:public CFather
{
public:
void display() const { cout<<"CSon::display()"<<iTest<<endl;}////包含iTest
};
class CGrandSon:public CSon
{
public:
void display() const { cout<<"CGrandSon::display()"<<iTest<<endl;}////包含iTest
};
void show(CFather *ptr)
{
ptr->display();
}
void showson(CSon *ptr)
{
ptr->display();
}
int main()
{
CFather father;
CSon son;
CGrandSon grandson;
show(&father);//父
show(&son);//子
show(&grandson);//孙
showson(&grandson);//子 getchar();
return ; }
结果:

c++ 基类,派生类的类型兼容性的更多相关文章
- C# 基类派生类构造函数执行顺序分析
using System; namespace ConsoleApp1 { class Program{ static void Main(string[] args){ B b = new B(); ...
- C#A类派生类强转基类IL居然还是可以调用派生类中方法的例子
大家都知道在C#中,如果B类继承自A类,如果一个对象是B类型的但是转换为A类型之后,这个对象是无法在调用属于B类型的方法的,如下例子: 基类A: public class A { } 派生类B: pu ...
- c++ 友元类 与 友元类派生类
定义: 当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问.我们就把类B叫做类A的友元. 用法: 在A类中加入: friend class B; 下面这个程序说明 ...
- 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
一.不能自动继承的成员函数 构造函数 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类 ...
- OOP1(定义基类和派生类)
面向对象程序设计基于三个基本概念:数据抽象,继承和动态绑定 数据抽象是一种依赖于接口和实现分离的编程技术.继承和动态绑定对程序的编号有两方面的影响:一是我们可以更容易地定义与其它类相似但不完全相同的类 ...
- C++:基类和派生类
4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public: void print() { cout<<"name:"&l ...
- .NET(C#):XML序列化时派生类的处理
原文 www.cnblogs.com/mgen/archive/2011/12/03/2275014.html 目录 1. 针对基类的XmlSerializer序列化派生类 2. 类内成员是派生类的序 ...
- C++继承 派生类中的内存布局(单继承、多继承、虚拟继承)
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化 译 译者前言 一个C ...
- c++——派生类和基类转换(类型兼容性原则)
基类也叫父类,派生类也叫子类. 类之间的继承关系继承关系是类之间的父子关系. 继承关系的特点如下:A. 子类拥有父类的所有属性和行为B. 子类也是一种特殊的父类C. 子类对象可以当父类对象使用D. 子 ...
随机推荐
- Vue组件库
滴滴cube-ui https://didi.github.io/cube-ui/#/zh-CN/docs/quick-start 有赞开源Vant(适合做商城) https://tech.youza ...
- 可变参数的lambda表达式
delegate int mydelegate(params int[] a); class Program { static void Main(string[] args) { //接收可变参数的 ...
- Java - 使可访问性最小化
模块设计是否良好,有个重要的因素在于,相对外部模块是否隐藏内部数据以及实现细节. 设计良好的模块会隐藏实现细节,并将API与其实现隔离开来. 模块之间通过API进行通信,对于内部工作情况互不可见. 即 ...
- Docker学习(三): Dockerfile指令介绍
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- 怎样求逆序对数(Inverse Number)?
#返回上一级 @Author: 张海拔 @Update: 2014-01-14 @Link: http://www.cnblogs.com/zhanghaiba/p/3520089.html /* * ...
- distinct 用法
参考 1.作用于单列 2.作用于多列 3.COUNT统计 4.distinct必须放在开头 5.其他 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值. ...
- jdk锁相关
锁类型 可重入锁:在执行对象中所有同步方法不用再次获得锁 可中断锁:在等待获取锁过程中可中断 公平锁: 按等待获取锁的线程的等待时间进行获取,等待时间长的具有优先获取锁权利 读写锁:对资源读取和写入的 ...
- MyBatis缓存通俗易懂
1.1 mybatis缓存介绍 如下图,是mybatis一级缓存和二级缓存的区别图解: Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的 ...
- Django中用Jquery实现不刷新页面进行身份验证和计算器功能
1.下载jquery http://www.jq22.com/jquery-info122 下载解压之后加入工程中的static文件夹中 2.路由分发. """Djang ...
- 如何在iview组件中使用jsx
最近选用的框架iview表单组件的render写法让人有点不习惯,尤其是在写比较复杂的逻辑的时候,还是感觉模板式的写法比较方便且可读性较强.而render函数除了支持配置写法外,还支持jsx的写法.由 ...