程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 不可或缺 Windows Native (22),native22

不可或缺 Windows Native (22),native22

編輯:C++入門知識

不可或缺 Windows Native (22),native22


[源碼下載]


不可或缺 Windows Native (22) - C++: 多重繼承, 虛基類



作者:webabcd


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

  • 多重繼承
  • 虛基類



示例
1、基類 1
CppBase1.h

#pragma once 

#include <string>
#include "CppBaseVirtual.h"

using namespace std;

namespace NativeDll
{
    // virtual 代表 CppBaseVirtual 是 CppBase1 的虛基類(虛基類是在聲明派生類時,指定繼承方式時聲明的)
    class CppBase1 : virtual public CppBaseVirtual
    {

    protected:
        string Name;
        float Salary;

    public:
        CppBase1(int number, string name, float salary);

    };
}

CppBase1.cpp

/*
 * 基類 1
 */

#include "pch.h" 
#include "CppBase1.h" 

using namespace NativeDll;

CppBase1::CppBase1(int number, string name, float salary) :CppBaseVirtual(number), Name("cppbase1 " + name), Salary(salary)
{

}


2、基類 2
CppBase2.h

#pragma once 

#include <string>
#include "CppBaseVirtual.h"

using namespace std;

namespace NativeDll
{
    // virtual 代表 CppBaseVirtual 是 CppBase2 的虛基類(虛基類是在聲明派生類時,指定繼承方式時聲明的)
    class CppBase2 : virtual CppBaseVirtual
    {

    protected:
        string Name;
        int Age;

    public:
        CppBase2(int number, string name, int age);

    };
}

CppBase2.cpp

/*
 * 基類 2
 */

#include "pch.h" 
#include "CppBase2.h" 

using namespace NativeDll;

CppBase2::CppBase2(int number, string name, int age) :CppBaseVirtual(number), Name("cppbase2 " + name), Age(age)
{

}


3、虛基類
CppBaseVirtual.h

#pragma once 

#include <string>

using namespace std;

namespace NativeDll
{
    class CppBaseVirtual
    {

    private:
        int Number;

    public:
        CppBaseVirtual(int number);

    };
}

CppBaseVirtual.cpp

/*
 * 用於演示虛基類
 *
 * 注:
 * 1、虛基類並不是在聲明基類時聲明的,而是在聲明派生類時,指定繼承方式時聲明的
 * 2、一個基類可以在生成一個派生類時作為虛基類,也可以在生成一個派生類時不作為虛基類
 */

#include "pch.h" 
#include "CppBaseVirtual.h" 

using namespace NativeDll;

CppBaseVirtual::CppBaseVirtual(int number) :Number(number)
{

}


4、派生類
CppDerived.h

#pragma once 

#include <string>
#include "CppBase1.h"
#include "CppBase2.h"

using namespace std;

namespace NativeDll
{
    class CppDerived : public CppBase1, public CppBase2
    {

    public:
        CppDerived(int number, string name, float salary, int age);

        string Show();

    };
}

CppDerived.cpp

/*
 * 派生類
 *
 *
 * 在多重繼承的情況下:
 * 1、如果 A 是 B C D E 的基類,F 同時繼承了 B C D E,那麼實例化 F 時會保存 4 份 A 成員
 * 2、如果 A 是 B 的基類,A 是 C D E 的虛基類(虛基類會使得在繼承間接共同基類時只保留一份成員),F 同時繼承了 B C D E,那麼實例化 F 時會保存 2 份 A 成員(從 C D E 的路徑上保留一份,從 B 的路徑上保留一份)
 *
 *
 * 本例中:
 * 1、CppBaseVirtual 是 CppBase1 和 CppBase2 的虛基類
 * 2、CppDerived 繼承了 CppBase1 和 CppBase2(多重繼承)
 * 3、此種情況,實例化 CppDerived 只會保留一份 CppBaseVirtual 成員(因為 CppBaseVirtual 是 CppBase1 和 CppBase2 的虛基類)
 * 4、C++ 編譯器只會執行最後的派生類(CppDerived)對虛基類(CppBaseVirtual)的構造函數的調用,而忽略虛基類的直接派生類(CppBase1 和 CppBase2)對虛基類的構造函數的調用,這就保證了虛基類的數據成員不會被多次初始化
 */

#include "pch.h" 
#include "CppDerived.h" 
#include "cppHelper.h"

using namespace NativeDll;

// 在無虛基類的情況下,派生類的構造函數中只需負責對其直接基類初始化
// 如果有虛基類,且虛基類中定義了帶參數的構造函數,且沒有定義默認構造函數,那麼派生類不僅要負責對其直接基類進行初始化,還要負責對虛基類初始化
CppDerived::CppDerived(int number, string name, float salary, int age) :CppBaseVirtual(number), CppBase1(number, name, salary), CppBase2(number, name, age)
{

}

string CppDerived::Show()
{
    // 關於多重繼承的二義性(ambiguous),如果派生類同時繼承的多個基類有相同的成員,則調用這些成員時需顯式指定其基類
    return CppBase1::Name + " " + float2string(Salary) + " " + int2string(Age);

    // 另外:當然,如果派生類與多個基類有相同成員的話,那麼基類中的這些與派生類相同的成員都會被隱藏掉(即派生類中的成員會覆蓋基類中的成員)
}


5、示例
CppClass6.h

#pragma once 

#include <string>

using namespace std;

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

CppClass6.cpp

/*
 * 多重繼承(multiple inheritance), 虛基類(virtual base class)
 */

#include "pch.h" 
#include "CppClass6.h" 
#include "CppDerived.h" 

using namespace NativeDll;

string CppClass6::Demo()
{
    CppDerived derived(0, "webabcd", 100.0f, 35);
    string result = derived.Show(); // cppbase1 webabcd 100.00 35

    return result;
}



OK
[源碼下載]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved