18.类继承
来源:互联网 发布:伤感网络歌曲女生唱的 编辑:程序博客网 时间:2024/06/06 05:17
#include "baseclass.hpp"#include "publicclass.hpp"int main(){{ base_class base1; public_class pub1(1,2,base1); base_class base2=public_class::base_class(); //基类指针和引用可在不显式转换下指向派生类对象 //基类指针和引用只能调用基类方法; pub1.base_show(1);//派生类对象可以使用 基类的公有方法 pub1.callprotected();} cout<<"-------------------------------------------------\n"; base_class *bapr=new public_class(0,0,0,0); delete bapr;//这里调用了base析构,实际是pub对象 }//构造函数不能是虚函数//析构函数应该是虚函数,除非不是基类//友元不能是虚函数//为什么定义虚析构?/*使用delete释放new分配的对象,值根据指针类型调用析构函数,这会导致,对象数据没有被释放,所以应该定义虚析构即使析构不做任何事,这样delete释放对象,先调用对象类型析构函数,再调用基类析构函数 */ /*继承类型:公有继承 私有继承 保护继承公有继承 派生类公有 继承 基类公有; is-a 私有继承 派生类私有 继承 基类公有、保护; has-a 保护继承 派生类保护 继承 基类公有、保护; has-a *//*更多类的使用方法 虚基类 继承关键词前加virtual 多重继承 MI 嵌套类 */
#ifndef __baseclass_hh#define __baseclass_hh#include "iostream" using namespace std;class base_class{ private : int a; int b; protected://保护数据,对外保护,对派生类不保护 int IamIsProtectedDate; public: base_class(void) { a=b=0; cout<<"create base object\n"; }; base_class(int a_,int b_) { a=a_; b=b_; cout<<"create base object\n"; }; void base_show(void) { cout<<"this is base fuc\n"; } virtual void base_show(int arg);//虚方法, 使派生类可以重定义 virtual ~base_class(void);//通常要为基类声明一个虚析构函数 virtual void base_show(int arg1,int arg2) =0;//后缀表示纯虚函数,即基类不定义函数 ,这个用于抽象基类 };void base_class::base_show(int arg){ if(arg) cout<<"this base virtual fuc\n";}; base_class::~base_class(void){ cout<<"这是base析构\n";} #endif
#ifndef __publicclass_h #define __publicclass_h #include "baseclass.hpp" #include "iostream" //publicclass 是 baseclass的派生类 //派生类继承了基类的实现,继承了基类的接口 //派生类需要自己的构造函数,可以添加额外的数据 class public_class : public base_class //公有继承 { private: int c; int d; public: void show(void) {std::cout<<c<<std::endl; }; public_class(int c,int d,int a,int b); public_class(int c,int d,base_class & tp);//第二种 virtual void base_show(int arg);//虚方法,派生类可以重定义 ~public_class(); void callprotected() { cout<<"我访问基类protected数据~ :"<<IamIsProtectedDate<<endl; }; }; public_class::~public_class() { cout<<"这时派生类析构\n"; }; public_class::public_class(int c,int d,int a,int b):base_class(a,b)//给基类初始化,不写则为默认初始化;会在创建派生类前给基类初始化 { c=d=0; cout<<"create public_class\n"; }; public_class::public_class(int c,int d,base_class & tp):base_class(tp)//给基类初始化,不写则为默认初始化;会在创建派生类前给基类初始化 { c=d=0; cout<<"create public_class\n"; }; void public_class::base_show(int arg) { if(arg) cout<<"this is virtual fuc from base\n"; } #endif
0 0
- 18.类继承
- 类继承、虚继承
- JS继承-类继承
- 继承、父子类、单继承、多继承
- C++ 类继承/虚继承/多重继承
- [Javascript] 继承 (原型继承, 类继承)
- 继承类
- 类继承
- 继承类
- 继承类
- 类继承
- 类继承
- 类继承
- 类继承
- 类继承
- 类 - 继承
- 继承类
- 类 -- 继承
- 16.复制构造函数
- HTTP协议详解(真的很经典)
- 第五届蓝桥杯A组java—波动数列
- 17.静态成员函数
- 写在前面的话
- 18.类继承
- ceph EC如何设置条带大小
- Tomcat简单介绍
- C变参编程
- 冒泡排序法
- 51nod 1449 砝码称重(经典贪心+进制)
- Python网络爬虫与信息提取(一):网络爬虫之规则
- Andriod Studio添加依赖的时候报错
- 一个memset函数使用时的坑