不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

时间:2022-08-19 01:53:21

[源码下载]

不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

作者:webabcd

介绍
不可或缺 Windows Native 之 C++

  • 继承
  • 组合
  • 派生类的构造函数和析构函数
  • 基类与派生类的转换
  • 子对象的实例化
  • 基类成员的隐藏(派生类成员覆盖基类成员)

示例
1、基类
CppAnimal.h

#pragma once 

#include <string>

using namespace std;

namespace NativeDll
{
class CppAnimal
{
private:
int Number; protected:
string Name;
int Age; public:
string Show(); CppAnimal(int number);
};
}

CppAnimal.cpp

/*
* 用于基类的演示
*/ #include "pch.h"
#include "CppAnimal.h"
#include "cppHelper.h" using namespace NativeDll; string CppAnimal::Show()
{
return "animal: " + int2string(Number) + " " + Name;
} CppAnimal::CppAnimal(int number) :Number(number)
{
Name = "动物";
}

2、派生类
CppTiger.h

#pragma once 

#include <string>
#include "CppAnimal.h"
#include "CppEmployee.h" using namespace std; namespace NativeDll
{
/*
* 基类(base class)
* 派生类(derived class)
* 继承(inheritance)
* 组合(composition) - 在一个类中以另一个类的对象作为数据成员的,称为类的组合
*
*
* public 继承:派生类不能访问基类的私有成员;基类的公有成员在派生类中依然是公有成员;基类的保护成员在派生类中依然是保护成员
* private 继承(默认值):派生类不能访问基类的私有成员;基类的公有成员在派生类中变为私有成员;基类的保护成员在派生类中变为私有成员
* protected 继承:派生类不能访问基类的私有成员;基类的公有成员在派生类中变为保护成员;基类的保护成员在派生类中依然是保护成员
*/ class CppTiger : public CppAnimal // 我是 public 继承,这是最常用的
// class CppTiger : private CppAnimal // 我是 private 继承
// class CppTiger : protected CppAnimal // 我是 protected 继承
// class CppTiger : CppAnimal // 默认是 private 继承
{ private:
string NickName; // 在一个类中以另一个类的对象作为数据成员的,称为类的组合
CppEmployee employee; // 我是 CppTiger 的子对象(subobject) protected:
// 派生类中的属性,如果其属性名与基类中的一样(不考虑属性的类型),则隐藏基类中的相应的属性(即派生类中的属性覆盖了基类中的属性)
float Age; public:
// 构造函数不会从基类继承过来,需要在派生类中自己写(注:析构函数也不会从基类继承过来,需要在派生类中自己写)
CppTiger(int number);
CppTiger(int number, string name, string nickName); // 用于演示如何在构造函数中,用简单的方式实例化子对象
CppTiger(int tigerNumber, string tigerName, int employeeNumber, string employeeName); // 派生类中的函数,如果其函数名和参数与基类中的一样(不考虑返回值类型),则隐藏基类中的相应的函数(即派生类中的函数覆盖了基类中的函数)
string Show();
};
}

CppTiger.cpp

/*
* 用于派生类的演示
*/ #include "pch.h"
#include "CppTiger.h"
#include "cppHelper.h" using namespace NativeDll; // 在派生类的构造函数中调用基类的构造函数(注:在无虚基类的情况下,派生类的构造函数中只需负责对其直接基类初始化)
CppTiger::CppTiger(int number) :CppAnimal(number)
{ } // 在派生类的构造函数中调用基类的构造函数,初始化派生类的私有成员
CppTiger::CppTiger(int number, string name, string nickName) :CppAnimal(number), NickName(nickName)
{
// 初始化基类的保护成员
Name = name;
} // 在构造函数中,用简单的方式实例化子对象(本例实例化了 employee 对象)
CppTiger::CppTiger(int tigerNumber, string tigerName, int employeeNumber, string employeeName) :CppAnimal(tigerNumber), employee(employeeNumber, employeeName)
{
// 如果用此种方式实例化子对象,则其实子对象会被实例化 2 次(声明时的 CppEmployee employee; 会被实例化一次,此处又会被实例化一次)
// this->employee = CppEmployee(employeeNumber, employeeName); Name = tigerName;
} // 我是 CppTiger 的 Show() 函数,由于与 CppAnimal 中的 Show() 函数同名且参数相同,所以 CppAnimal 中的 Show() 函数会被隐藏掉。也可以说 CppTiger 的 Show() 函数覆盖了 CppAnimal 中的 Show() 函数
string CppTiger::Show()
{
// 在派生类中调用基类成员的话,需要通过“::”来实现
// 本例中如果要调用基类的 Show() 的话,就这么写 CppAnimal::Show()
// 如果直接调用 Show() 的话就死循环了 return "tiger: " + Name + ", employee: " + employee.Show() + ", " + CppAnimal::Show();
}

3、示例
CppClass5.h

#pragma once 

#include <string>

using namespace std;

namespace NativeDll
{
class CppClass5
{
public:
string Demo();
};
}

CppClass5.cpp

/*
* 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
*/ #include "pch.h"
#include "CppClass5.h"
#include "CppTiger.h" using namespace NativeDll; string cppclass5_demo1();
string cppclass5_demo2();
void cppclass5_demo3(); string CppClass5::Demo()
{
string r1 = cppclass5_demo1();
string r2 = cppclass5_demo2();
string result = r1 + "\n" + r2; // 基类与派生类的转换
cppclass5_demo3(); return result;
} string cppclass5_demo1()
{
// 此处演示了派生类的构造函数
CppTiger tiger(, "老虎", "大猫"); // 此处演示了基类成员的隐藏(派生类成员覆盖基类成员)
string result = tiger.Show(); // tiger: 老虎, employee: 888 webabcd, animal: 100 老虎 return result;
} string cppclass5_demo2()
{
// 此处演示了派生类的构造函数,以及同时实例化子对象
CppTiger tiger2(, "老虎", , "wanglei"); // 此处演示了基类成员的隐藏(派生类成员覆盖基类成员)
string result = tiger2.Show(); // tiger: 老虎, employee: 200 wanglei, animal: 100 老虎 return result;
} // 基类与派生类的转换
void cppclass5_demo3()
{
// 派生类对象可以赋值给基类对象(反之不可),基类对象无法使用派生类对象的特性
CppTiger tiger(, "老虎", , "wanglei");
CppAnimal animal = tiger;
// 调用的是基类的 Show() 函数(但是数据成员是通过 CppTiger 实例化而来的)
string result = animal.Show(); // animal: 100 老虎 // 指向基类对象的指针,也可以指向派生类对象(反之不可),但是无法使用派生类对象的特性
CppAnimal animal2();
CppAnimal *animal2Pointer = &animal2;
CppTiger tiger2(, "老虎", , "wanglei");
animal2Pointer = &tiger2;
// 调用的是基类的 Show() 函数(但是数据成员是通过 CppTiger 实例化而来的)
string result2 = animal2Pointer->Show(); // animal: 200 老虎
}

OK
[源码下载]

不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)的更多相关文章

  1. 不可或缺 Windows Native 系列文章索引

    [源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...

  2. C&plus;&plus;学习之路—继承与派生(二):派生类的构造函数与析构函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...

  3. 不可或缺 Windows Native &lpar;22&rpar; - C&plus;&plus;&colon; 多重继承&comma; 虚基类

    [源码下载] 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 多重继承 虚基类 示例1 ...

  4. 不可或缺 Windows Native &lpar;23&rpar; - C&plus;&plus;&colon; 虚函数

    [源码下载] 不可或缺 Windows Native (23) - C++: 虚函数 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 虚函数 示例1.基类CppHuman ...

  5. 不可或缺 Windows Native &lpar;14&rpar; - C&plus;&plus;&colon; 文件

    [源码下载] 不可或缺 Windows Native (14) - C++: 文件 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 文件 示例CppIO2.h #prag ...

  6. 不可或缺 Windows Native &lpar;13&rpar; - C&plus;&plus;&colon; 标准输入&comma; 标准输出&comma; 字符串内存流

    [源码下载] 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 标准输 ...

  7. 不可或缺 Windows Native &lpar;25&rpar; - C&plus;&plus;&colon; windows app native&comma; android app native&comma; ios app native

    [源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...

  8. 不可或缺 Windows Native &lpar;24&rpar; - C&plus;&plus;&colon; 运算符重载&comma; 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  9. 不可或缺 Windows Native &lpar;20&rpar; - C&plus;&plus;&colon; 友元函数&comma; 友元类

    [源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...

随机推荐

  1. ASP&period;NET 中的 Async&sol;Await 简介

    本文转载自MSDN 作者:Stephen Cleary 原文地址:https://msdn.microsoft.com/en-us/magazine/dn802603.aspx 大多数有关 async ...

  2. annotation-config vs component-scan – Spring Core--转

    原文地址:http://techidiocy.com/annotation-config-vs-component-scan-spring-core/ <context:annotation-c ...

  3. 【转】如何修改Chrome缓存目录的地址

    本文转自:http://www.nowamagic.net/librarys/veda/detail/2573 C盘空间越来越小,在Win7里还标红了,心里看得不舒服,得想一些方法腾出一些空间.看了A ...

  4. 【wikioi】1227 方格取数 2(费用流)

    http://www.wikioi.com/problem/1227 裸题,拆点,容量为1,费用为点权的负数(代表只能取一次).再在拆好的两个点连边,容量为oo,费用为0.(代表能取0) 然后向右和下 ...

  5. CCNA第二讲笔记

    网络定义:一组由介质(线缆)互联的网络设备(路由器.交换机)和终端系统(PC): 工作组:局域网范畴,范围最小的局域网,且不涉及网络设备.台式机需要有多块网卡,利用双绞线与其他台式机进行互联,扩展性差 ...

  6. 导航 -MapKit - 获取路线信息绘制导航路线

    #import "PPViewController.h" #import <MapKit/MapKit.h> #import "PPAnnotation.h& ...

  7. CKplayer 新手入门超简单使用教程

    网页播放器都有使用的前提(问1). ~~~~~~~分隔线~~~~~~~ 只需一步先看播放器效果(问2): 下载附件,解压内容(ckplayer文件夹和ckplayer.html)到网站根目录,在浏览器 ...

  8. struct 类型指针技巧

    此类型对于两种结构的查找和删除都十分方便,实际项目中也常常用到.

  9. 用java开发图形界面项目,如何实现从本地选择图片文件并以二进制流的形式保存到MySQL数据库,并重新现实到面板

  10. elasticsearch搜索引擎环境的搭建

    elasticsearch 搜索引擎 解决了什么问题:在我们数据量很大时,我们使用模糊查询会使索引列的索引消失,这样使用elasticsearch来提高查询效率. 存在什么问题:有时我们查询的词,el ...