[源碼下載]
作者: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(100, "老虎", "大貓");
// 此處演示了基類成員的隱藏(派生類成員覆蓋基類成員)
string result = tiger.Show(); // tiger: 老虎, employee: 888 webabcd, animal: 100 老虎
return result;
}
string cppclass5_demo2()
{
// 此處演示了派生類的構造函數,以及同時實例化子對象
CppTiger tiger2(100, "老虎", 200, "wanglei");
// 此處演示了基類成員的隱藏(派生類成員覆蓋基類成員)
string result = tiger2.Show(); // tiger: 老虎, employee: 200 wanglei, animal: 100 老虎
return result;
}
// 基類與派生類的轉換
void cppclass5_demo3()
{
// 派生類對象可以賦值給基類對象(反之不可),基類對象無法使用派生類對象的特性
CppTiger tiger(100, "老虎", 200, "wanglei");
CppAnimal animal = tiger;
// 調用的是基類的 Show() 函數(但是數據成員是通過 CppTiger 實例化而來的)
string result = animal.Show(); // animal: 100 老虎
// 指向基類對象的指針,也可以指向派生類對象(反之不可),但是無法使用派生類對象的特性
CppAnimal animal2(100);
CppAnimal *animal2Pointer = &animal2;
CppTiger tiger2(200, "老虎", 300, "wanglei");
animal2Pointer = &tiger2;
// 調用的是基類的 Show() 函數(但是數據成員是通過 CppTiger 實例化而來的)
string result2 = animal2Pointer->Show(); // animal: 200 老虎
}
OK
[源碼下載]