条款40:明智而审慎的使用多重继承

 

使用private继承 实现:

复制代码
#pragma once
#include "IPerson.h"
#include "PersonInfo.h"

class CPerson1 : public IPerson, private PersonInfo
{
public:

    explicit CPerson1(const char* name)
        : PersonInfo(name)
    {
    }

    virtual ~CPerson1()
    {
    }

    virtual std::string name() const
    {
        return PersonInfo::theName();
    }
    virtual std::string birthDate() const
    {
        return PersonInfo::theBirthDate();
    }
private:
    virtual const char* valueDelimOpen() const
    {
        return "";
    }

    virtual const char* valueDelimClose() const
    {
        return "";
    }
};

//---------------------------
#pragma once
#include <string>
class IPerson{

public:
    virtual ~IPerson(){

    }
    virtual std::string name() const = 0;
    virtual std::string birthDate() const = 0;
};
//----------------------------
#pragma once
#include <string>
class PersonInfo
{
    const char* name;
public:

    explicit PersonInfo(const char* name)
        : name(name)
    {
    }

    virtual ~PersonInfo()
    {
    }

    virtual const char* theName() const
    {
        static char value[255];
        std::strcpy(value, valueDelimOpen());
        std::strcat(value, name);
        std::strcat(value, valueDelimClose());
        return value;
    }

    virtual const char* theBirthDate() const
    {
        return "";
    }

    virtual const char* valueDelimOpen() const
    {
        return "[";
    }

    virtual const char* valueDelimClose() const
    {
        return "]";
    }
};


//---------------------------
#include <iostream>
#include "Person1.h"
#include "Person2.h"
#include "Person3.h"
using namespace std;



int main(){
    //debug 探测内存泄露
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    //int* p = new int;

    CPerson1 p1("Lee Psalm");
    cout << p1.name() << endl;
    cout << p1.name() << endl;
    CPerson2 p2("Lee Psalm 2");
    cout << p2.name() << endl;
    cout << p2.name() << endl;

    CPerson3 p3("Lee Psalm 3");
    cout << p3.name() << endl;
    cout << p3.name() << endl;


    
    return 0;
}
View Code
复制代码

使用 组合 实现:

复制代码
#pragma once
#include <string>
class IPerson{

public:
    virtual ~IPerson(){

    }
    virtual std::string name() const = 0;
    virtual std::string birthDate() const = 0;
};
//------------------------------
#pragma once
#include <string>
class PersonInfo
{
    const char* name;
public:

    explicit PersonInfo(const char* name)
        : name(name)
    {
    }

    virtual ~PersonInfo()
    {
    }

    virtual const char* theName() const
    {
        static char value[255];
        std::strcpy(value, valueDelimOpen());
        std::strcat(value, name);
        std::strcat(value, valueDelimClose());
        return value;
    }

    virtual const char* theBirthDate() const
    {
        return "";
    }

    virtual const char* valueDelimOpen() const
    {
        return "[";
    }

    virtual const char* valueDelimClose() const
    {
        return "]";
    }
};


//------------------------------
#pragma once
#include "IPerson.h"
#include "PersonInfo.h"
#include <memory>

class CPerson3 : public IPerson
{
private:
    class PersonInfo2 : public PersonInfo
    {
    public:
        explicit PersonInfo2(const char* name)
            : PersonInfo(name)
        {

        }
        virtual const char* valueDelimOpen() const
        {
            return "<";
        }

        virtual const char* valueDelimClose() const
        {
            return ">";
        }

    };
    std::shared_ptr<PersonInfo2> pPersonInfo;
    //PersonInfo2* pPersonInfo;
public:

    CPerson3(const char* name)
        : pPersonInfo(new PersonInfo2(name))
    {
    }

    virtual ~CPerson3()
    {
    }

    virtual std::string name() const
    {
        return pPersonInfo->theName();
    }
    virtual std::string birthDate() const
    {
        return pPersonInfo->theBirthDate();
    }

};


//------------------------------
//------------------------------
#include <iostream>
#include "Person1.h"
#include "Person2.h"
#include "Person3.h"
using namespace std;



int main(){
    //debug 探测内存泄露
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    //int* p = new int;

    CPerson1 p1("Lee Psalm");
    cout << p1.name() << endl;
    cout << p1.name() << endl;
    CPerson2 p2("Lee Psalm 2");
    cout << p2.name() << endl;
    cout << p2.name() << endl;

    CPerson3 p3("Lee Psalm 3");
    cout << p3.name() << endl;
    cout << p3.name() << endl;


    
    return 0;
}
//------------------------------
View Code
复制代码

 

 

**

posted @   htj10  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
TOP
点击右上角即可分享
微信分享提示