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. 子 ...
随机推荐
- 使用TensorFlow进行中文自然语言处理的情感分析
1 TensorFlow使用 分析流程: 1.1 使用gensim加载预训练中文分词embedding 加载预训练词向量模型:https://github.com/Embedding/Chinese ...
- nvm安装最新稳定版node
安装当前最新的稳定版. nvm install stable
- 深入理解Java线程池:ScheduledThreadPoolExecutor
介绍 自JDK1.5开始,JDK提供了ScheduledThreadPoolExecutor类来支持周期性任务的调度.在这之前的实现需要依靠Timer和TimerTask或者其它第三方工具来完成.但T ...
- SpringBoot Mybatis的驼峰命名
开启驼峰命名的方法 第一种方式: 可以在配置类中进行配置.配置的Demo如下: @Bean(name="sqlSessionFactory") public SqlSessionF ...
- 安装vmware player
一.简介 什么是虚拟机? 虚拟机是通过软件来模拟一个完整的计算机系统.简单来说,你可以在当前系统中通过虚拟机软件运行另外一个系统,并且与当前系统隔离. 什么是vmware? vmware(virtua ...
- sql = 和<>遵循的sql-92标准的设置SET ANSI_NULLS ON
说明 SQL-92 标准要求在对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE. 当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空 ...
- Mysql压缩版forWindows安装与配置
参考:http://blog.csdn.net/wengengeng/article/details/52013650
- git 命令合并分支代码
git 命令合并分支代码 对于复杂的系统,我们可能要开好几个分支来开发,那么怎样使用git合并分支呢? 合并步骤: 1.进入要合并的分支(如开发分支合并到master,则进入master目录) git ...
- Hunger Snake3
- CF961F k-substrings
题意 给定一个字符串 \(S\) 求所有的 \(S[i,n-i+1]\) 的 \(border\) 长度(最长的前缀等于后缀),要求长度是奇数 \(n\le 10^6\) Sol 首先发现每次求的串都 ...