基类和派生类
来源:互联网 发布:淘宝拉夏贝尔代购 编辑:程序博客网 时间:2024/06/11 23:18
对象类型:静态类型和动态类型。静态类型是在编译时就已经知道的类型。动态类型是在内存中的对象,直到运行时才知道类型。
如果基类base中有虚函数,派生类sub继承基类,在初始化时:
1、通过类定义的基类对象,用派生类去初始化基类时,基类对象不会转化为派生类对象,即基类对象调用的函数还是自己内部写的;
2、通过指针,定义的基类对象,用派生类去初始化时,会将此基类对象转化为派生类对象,即调用的重载函数是派生类内部的函数,和基类的函数无关。即:基类的指针或引用可以绑定的派生类对象上,这也就对于工厂模式最好的利用。可以通过基类的调用,在程序运行中,根据不同的配置,去实例化不同的版本的对象。例如db2类和oracle类。
3、基类中有虚函数,对基类实例化对象以后,该对象仍能够调用该虚函数,且能执行。当使用基类的指针或引用时,调用一个虚函数会执行动态绑定,即直到运行时才知道调用了哪个版本的虚函数,所以所有的虚函数都必须有定义,不管是否用到,因为连编译器也无法确定到底会使用哪个虚函数;
4、记住:动态绑定只有当通过指针或引用调用虚函数时才会发生。当通过一个具有普通类型而非指针或引用,调用虚函数时,在编译时就会将调用的版本确定下来。
5、基类中的虚函数,则在其以后的所有派生类中都是虚函数。所以不必在派生类中还对重载的虚函数使用virtual。
代码如下:
#include<iostream>using namespace std;class base{public: //base(int temp):s(temp){} void dog() { cout<<"dog"<<endl; } virtual void animal() { cout<<"animal"<<endl; } //int s;};class sub:public base{public: //sub(int temp):base(temp){} void animal() override { cout<<"my animal"<<endl; } void our() { cout<<"our"<<endl; }};void main(){ /*sub sub1; base parent(sub1); parent.animal();//输出animal system("pause");*/ base *parent = new sub(); parent->animal();//输出:my animal system("pause");}
0 0
- 派生和基类
- 基类和派生类
- 基类和派生类
- 基类和派生类
- 基类和派生类
- 基类和派生类
- 基类和派生类
- 基类和派生类
- 基类和派生类
- 类和派生类
- 继承和派生类
- C++ 基类和派生类
- C++ 基类和派生类
- C++ 基类和派生类
- C++基础--基类和派生类
- C++基类和派生类
- 继承:基类和派生类
- 12.2.1 基类和派生类
- POJ3009-Curling 2.0
- Eclipse设置:背景与字体大小和xml文件中字体大小调整(转载)
- 浅谈《机房收费系统》重构中的Boolean和Datatable
- [BZOJ2631]tree
- android导入项目时提示:invalid project description的解决办法
- 基类和派生类
- 自定义RatingBar
- K60学习笔记五:串行通信的时序分析
- [CodeVs][1514][Treap][书架]
- Windows x64 Android开发环境搭建
- Java_SE05-Comparable,Map接口,队列,栈
- iOS学习笔记之UI-UISearchController-And-UITableView
- 给图像添加边界
- mysql 事务