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;
}
};
记录当下,我的编程之路