简单使用..
#include <iostream>
using namespace std;
class Bed//床
{
public:
Bed(int weight):weight_(weight)
{
}
void Sleep()
{
cout<<"Sleep...."<<endl;
};
int weight_;
};
class Sofa//沙发
{
public:
Sofa(int weight):weight_(weight)
{
}
int weight_;
void WatchTV()
{
cout<<"Watch TV.."<<endl;
}
};
class SofaBed:public Bed,public Sofa//沙发床
{
public:
SofaBed():Bed(0),Sofa(0)
{
FeldIn();
}
void FeldOut()
{
cout<<"FeldOut.."<<endl;
}
void FeldIn()
{
cout<<"FeldIn.."<<endl;
}
};
int main(void)
{
SofaBed sofaBed;
//sofaBed.weight_=10;//问题:沙发床继承了床的重量和沙发的重量,到底给哪个成员赋值呢?
sofaBed.Bed::weight_=10;
sofaBed.Sofa::weight_=20;//这样其实不符合业务逻辑,只有一个重量。
sofaBed.WatchTV();
sofaBed.FeldOut();
sofaBed.Sleep();
return 0;
}
#include <iostream>
using namespace std;
class Furniture
{
public:
Furniture(int weight):weight_(weight)
{
}
int weight_;
};
class Bed:public Furniture//床
{
public:
Bed(int weight):Furniture(weight)
{
}
void Sleep()
{
cout<<"Sleep...."<<endl;
};
};
class Sofa:public Furniture//沙发
{
public:
Sofa(int weight):Furniture(weight)
{
}
void WatchTV()
{
cout<<"Watch TV.."<<endl;
}
};
class SofaBed:public Bed,public Sofa//沙发床
{
public:
SofaBed(int weight):Bed(weight),Sofa(weight)
{
FeldIn();
}
void FeldOut()
{
cout<<"FeldOut.."<<endl;
}
void FeldIn()
{
cout<<"FeldIn.."<<endl;
}
};
int main(void)
{
SofaBed sofaBed(10);
//修改重量
//sofaBed.weight_=20;//error..这个跟java 不同,走的是两条路bed,和sofa,本质上还是有两个weight
sofaBed.Sofa::weight_=20;//还是有歧义的存在
sofaBed.WatchTV();
sofaBed.FeldOut();
sofaBed.Sleep();
return 0;
}
采用虚继承,weight 是共享的。。
下面没有歧义了,weight 只有一份拷贝了。。
#include <iostream>
using namespace std;
class Furniture
{
public:
/*Furniture(int weight):weight_(weight)
{
}*/
int weight_;
};
class Bed:virtual public Furniture//床
{
public:
/*Bed(int weight):Furniture(weight)
{
}*/
void Sleep()
{
cout<<"Sleep...."<<endl;
};
};
class Sofa:virtual public Furniture//沙发
{
public:
/*Sofa(int weight):Furniture(weight)
{
}*/
void WatchTV()
{
cout<<"Watch TV.."<<endl;
}
};
class SofaBed:virtual public Bed,public Sofa//沙发床
{
public:
/*SofaBed(int weight):Bed(weight),Sofa(weight)
{
FeldIn();
}*/
void FeldOut()
{
cout<<"FeldOut.."<<endl;
}
void FeldIn()
{
cout<<"FeldIn.."<<endl;
}
};
int main(void)
{
SofaBed sofaBed;
//修改重量
sofaBed.weight_=20;//这个时候没有歧义了。
sofaBed.WatchTV();
sofaBed.FeldOut();
sofaBed.Sleep();
return 0;
}
所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。
#include <iostream>
using namespace std;
class Furniture
{
public:
Furniture(int weight):weight_(weight)
{
}
int weight_;
};
class Bed:virtual public Furniture//床
{
public:
Bed(int weight):Furniture(weight)
{
}
void Sleep()
{
cout<<"Sleep...."<<endl;
};
};
class Sofa:virtual public Furniture//沙发
{
public:
Sofa(int weight):Furniture(weight)
{
}
void WatchTV()
{
cout<<"Watch TV.."<<endl;
}
};
class SofaBed: public Bed,public Sofa//沙发床
{
public:
SofaBed(int weight):Bed(weight),Sofa(weight),Furniture(weight)//不应该在Bed,和 Sofa 中构造,构造了两次。
{
FeldIn();
}
void FeldOut()
{
cout<<"FeldOut.."<<endl;
}
void FeldIn()
{
cout<<"FeldIn.."<<endl;
}
};
int main(void)
{
SofaBed sofaBed(10);
//修改重量
sofaBed.weight_=20;//这个时候没有歧义了。
sofaBed.WatchTV();
sofaBed.FeldOut();
sofaBed.Sleep();
return 0;
}
值得一提,调用的构造函数跟继承的顺序有关,跟初始化列表中的无关。