Problem E: Lemon(关于虚继承和多继承的作用)

7 篇文章 0 订阅

 

APPEND CODE

int main()

{

    Citrus     *c;

    Mandarin   *ma;

    Pomelo     *po;

    Citron     *ci;

    Orange     *og;

    Lime       *li;

    Tangerine  *ta;

    Grapefruit *gr;

    Lemon      *le;

    string name;

    double weight;

    while(cin >> name >> weight)

    {

        if(name == "Tangerine")

        {

            Tangerine tangerine(name, weight);

            c = ma = og = ta = &tangerine;

            c->show();

            ma->show();

            og->show();

            ta->show();

        }

        if(name == "Grapefruit")

        {

            Grapefruit grapefruit(name, weight);

            c = po = gr = &grapefruit;

            c->show();

            po->show();

            gr->show();

        }

        if(name == "Lemon")

        {

            Lemon lemon(name, weight);

            ma = og = &lemon;

            ci = li = &lemon;

            po = le = &lemon;

            ma->show();

            po->show();

            ci->show();

            og->show();

            li->show();

            le->show();

        }

    }

}

首先要用到虚继承,这是一个复杂的多继承问题,同时要注意子类中要包含父类子对象(即要在子类中进行父类的构造函数,注意这里要构造到底,即与该子类有关系的父类都要构造一遍,一直构造到底)在多重继承的时候,如果父类中有同名的成员变量(类似这篇文章中谈及的例子),为了防止二义性,一般要采用虚继承的方式,并且最右边的基类中的那个成员变量会出现在派生类对象中(可以理解为覆盖值)。

下面就是繁琐的代码了:代码实现较为容易,只是注意虚继承的使用就好

#include <iostream>

#include <iomanip>

//template <typename T>

using namespace std;

class Citrus{

public:

    string name;

    double w;

public:

    Citrus(string name_,double w_):name(name_),w(w_){}

    void show()

    {

        cout<<name<<" "<<w<<"kg, is citrus fruit."<<endl;

    }

};

class Mandarin:virtual public Citrus{

public:

    Mandarin(string name_,double w_):Citrus(name_,w_){}

    void show()

    {

        cout<<name<<" "<<w<<"kg, is mandarin."<<endl;

    }

};

class Pomelo:virtual public Citrus{

public:

    Pomelo(string name_,double w_):Citrus(name_,w_){}

    void show()

    {

        cout<<name<<" "<<w<<"kg, is pomelo."<<endl;

    }

};

class Citron:virtual public Citrus{

public:

 Citron(string name_,double w_):Citrus(name_,w_){}

    void show()

    {

        cout<<name<<" "<<w<<"kg, is citron."<<endl;

    }

};

class Orange:virtual public Mandarin,virtual public Pomelo{

public:

    Orange(string name_,double w_):Mandarin(name_,w_),Pomelo(name_,w_),Citrus(name_,w_){}

    void show()

    {

        cout<<name<<" "<<w<<"kg, is orange."<<endl;

    }

};

class Lime:virtual public Pomelo,virtual public Citron{

public:

    Lime(string name_,double w_):Pomelo(name_,w_),Citron(name_,w_),Citrus(name_,w_){}

    void show()

    {

        cout<<name<<" "<<w<<"kg, is lime."<<endl;

    }

};

class Tangerine:virtual public Mandarin,virtual public Orange{

public:

      Tangerine(string name_,double w_):Orange(name_,w_),Mandarin(name_,w_), Pomelo(name_, w_) ,Citrus(name_,w_)

    {

    }

    void show()

    {

        cout<<name<<" "<<w<<"kg, is tangerine."<<endl;

    }

};

class Grapefruit:virtual public Orange,virtual public Pomelo{

public:

     Grapefruit(string name_,double  w_):Orange(name_,w_),Pomelo(name_,w_),Mandarin(name_,w_),Citrus(name_,w_)

    {

    }

    void show()

    {

        cout<<name<<" "<<w<<"kg, is grapefruit."<<endl;

    }

};

class Lemon:virtual public Orange,virtual public Lime{

public:

     Lemon(string name_,double w_): Orange(name_, w_), Lime(name_, w_), Pomelo(name_, w_), Mandarin(name_, w_), Citron(name_, w_), Citrus(name_, w_)

    {

    }

    void show()

    {

        cout<<name<<" "<<w<<"kg, is lemon."<<endl;

    }

};

                                         记录当下,我的编程之路

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值