1》首先建立一个基类Student类

头文件Student.h 如下:

#ifndef Student_h
#define Student_h
#include<string>
using namespace std;
/*
基类Student头文件
*/
class Student{
protected:int num;string name;float score;public:Student(int num,string name,float score);void display();//******这里没有声明为virtual};#endif

2》基类Student实现

Student.cpp

#include"Student.h"
#include<iostream>
Student::Student(int num, std::string name, float score){this->num=num;this->name=name;this->score=score;}
void Student::display(){cout<<"num:"<<this->num<<endl;cout<<"name:"<<this->name<<endl;cout<<"score:"<<this->score<<endl;}

3》派生类Graduate类头文件

#ifndef Graduate_h
#define Graduate_h
#include"Student.h"
/*
派生类头文件,公有继承Student类,并增加新属性wage;
*/
class Graduate:public Student{protected:float wage;public:Graduate(int num,string name,float score,float wage);void display();
};#endif

4》派生类Graduate实现

#include<iostream>
#include"Graduate.h"
Graduate::Graduate(int num, std::string name, float score,float wage):Student(num,name,score){this->wage=wage;
}void Graduate::display(){cout<<"num:"<<this->num<<endl;cout<<"name:"<<this->name<<endl;cout<<"score:"<<this->score<<endl;cout<<"wage:"<<this->wage<<endl;}

5》测试

#include<iostream>
#include"Student.h"
#include"Graduate.h"
using namespace std;
int main(){Student stu(1001,"LI",78.9);Graduate gra(2001,"Wang",88.9,200.0);Student *p_stu=&stu;//声明基类Student类的指针并指向Student类的对象p_stu->display();//通过指针调用display函数。---正常输出stu的num,name,scorep_stu=&gra;//基类Student类的指针指向派生类Graduate类的对象(兼容赋值)p_stu->display();//通过指针调用display函数。---只能输出派生类中基类成员的值return 0;}

运行结果如下:

第二次只是输出了派生类中相应的基类成员,而派生类中新增的数据成员“wage”没有输出 。

6》如何才能使其输出呢(即实现多态性)

将基类Student类中的display函数声明为虚函数即可:virtual void display();

再次运行就可以发现,可以利用父类的指针(p_stu)指向子类的对象(gra),通过p_stu->display()即可调用子类的display函数了。

7》这种多态性也适用于析构函数中。

上述两个类均未给出析构函数的形式,其使用默认析构函数

当类中存在有动态分配的存储时,该类的对象析构时也要进行回收资源。这里为了实验,只是打印一句话。

分别在头文件和类实现中声明和实现该析构函数,如下:

声明:

~Student();

实现:

Student::~Student(){cout<<"executing Student destructor"<<endl;
}

声明:

~Graduate();

实现:

Graduate::~Graduate(){cout<<"executing Student destructor"<<endl;}

在Main函数中有如下语句 :

 Student *p_stu=new Graduate(3001,"zhang",88.7,300);p_stu->display();delete p_stu;

此时结果为:

可以看出,只执行了基类的析构函数,而没有执行派生类的析构函数。原因跟之前 介绍 的display()函数调用相同。

8》如何也能执行派生类的析构函数呢?

方法与之前介绍的display函数一样,使用虚函数,即使用虚析构函数。

将析构函数声明为虚函数:即在前面添加Virtual即可(只需要在基类中声明为Virtual即可,其派生类自动变为virtual)。

此时结果为:

C++基类与派生类的转换与多态性相关推荐

  1. 派生类到基类的转换 和基类到派生类的转换

    一. 基类与派生类的转换     3种继承方式(公用.保护.私有继承)中,公用派生类才是基类真正的子类型,它完整地继承了基类的功能.     不同类型数据之间在一定条件下可以进行类型的转换.基类与派生 ...

  2. 基类与派生类之间的转换关系

    一. 派生类到基类的转换: 1.可以使用派生类指针初始化基类指针,同样也可以使用派生类的引用或对象初始化基类的引用,注意这里提到的是对象的指针和引用而不是对象本身: (但是,在使用基类指针(或引用)指 ...

  3. c++,派生类对象可以对基类赋值,基类对派生类不可以赋值

    派生类对象可以对基类对象赋值,赋值时属于派生类独有的部分就舍弃不用. #include <iostream> using namespace std;class DemoA { publi ...

  4. 基类与派生类的类型转换

    类型转换规则: 公有派生类对象可以被当作基类的对象使用,反之则不可 派生类的对象可以隐含转换为基类对象 派生类的对象可以初始化基类的引用 派生类的指针可以隐含转换为基类的指针 通过基类对象名,指针只能 ...

  5. 14.11 基类与派生类关系的详细再探讨

    一:派生类对象模型简述 Men mymen:子类(派生类对象),包含多个组成部分(也就是多个子对象); <1>一个是含有派生类自己定义的成员变量,成员函数的子对象: <2>一个 ...

  6. C++中基类与派生类的构造函数和析构函数

    1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...

  7. C++:基类和派生类

    4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public:void print(){cout<<"name:"<& ...

  8. 构造函数怎么在主函数调用_C++ 虚基类及其派生类构造函数(学习笔记:第7章 12)...

    虚基类及其派生类构造函数[1] 建立对象时所指定的类称为最远派生类. 虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的. 在整个继承结构中,直接或间接继承虚基类的所有派生类,都 ...

  9. c++中基类与派生类中隐含的this指针的分析

    先不要看结果,看一下你是否真正了解了this指针? 1 #include<iostream> 2 using namespace std; 3 4 class Parent{ 5 publ ...

  10. java基类和派生类圆_java – 当基类和派生类都具有相同名称的变量时会发生什么...

    在这些类中考虑int变量: class Foo { public int a = 3; public void addFive() { a += 5; System.out.print("f ...

最新文章

  1. SAP PM 初级系列23 - IW22 事务代码里创建维修工单
  2. html退出登录_[实战小剧场servletamp;jsp] 用户登录及退出功能实现
  3. SQLServer 数据库变成单个用户后无法访问问题的解决方法
  4. 远程链接错误:这可能是由于credssp加密oracle修正
  5. Spring框架 IOC
  6. python生成exe启动很慢,win2000上的python启动非常慢
  7. 视图,触发器,事务,存储过程,函数与流程控制,索引
  8. size()计算jquery对象中元素的个数
  9. 2021年复盘总结发现了C站博主缺少的赚钱之路
  10. android 遥控器home键键值,android 中遥控器键值的添加和修改
  11. 编程入门:零基础想要学好C/C++编程?那你一定要看看这五个步骤!
  12. ROS小车打造(12)--Arduino订阅cmd_vel实现差速控制
  13. cad直线和圆弧倒角不相切_CAD中圆角(fillet)与倒角(chamfer)的技巧总结
  14. vlookup(精确查找、区间查找、反向查找、多条件查找)
  15. java6安全设置_小米安全中心
  16. 基本搜索技术--人机博弈算法(极大极小,深度优先,负极大值)
  17. 『现学现忘』Shell编程 — 22、基础正则表达式
  18. win10系统无法访问ftp服务器地址,win10系统访问不了ftp的解决教程
  19. 代理记账公司是如何进行缴税的?
  20. 论文笔记 Feature Selective Anchor-Free Module for Single-Shot Object Detection - CVPR 2019

热门文章

  1. POJ 1017 Packets【贪心】
  2. WebStorm10.0.4 Live Edit与Google浏览器实时无刷新自动加载页面
  3. 改进的简单Tooltips显示
  4. POJ 2263 floyd思想
  5. 表空间迁移(transport tablespace)测试案例
  6. 【css】常用的几种水平垂直居中方式与盒子模型,面试经常问到!
  7. WebDriver高级应用实例(7)
  8. 【uoj#139】[UER #4]被删除的黑白树 贪心
  9. bagging and boosting
  10. vim--之初学轻松几步走