c++多重继承前使用 virtual
c++多重继承中,因为多个父类可能具有相同的数据域,就可能会出现多重同名的数据域共存的问题。这种共存的问题除了内存使用的浪费还有可能造成程序出现的不可预测的问题(因为访问的数据可能是同名不同域的)。要解决这个问题,就需要让多重继承的的基类用virtual继承更上一层的类
正确的做法如下:
class A{
}
class A_0:virtual public A{
}
class A_1:virtual public A{
}
class B: public A_0,public A_1{
}
错误的写法:
class A{
}
class A_0:public A{
}
class A_1:public A{
}
class B: virtual public A_0,virtual public A_1{
}
示例代码:
//
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
class Grass{
public:
Grass():_name("grass"){
};
virtual ~Grass(){};
virtual string get_name() const;
void set_name(string str);
private:
string _name;
};
string Grass::get_name() const{
return _name;
}
void Grass::set_name(string str){
_name = str;
}
class BlueGrass:virtual public Grass{
public:
BlueGrass();
virtual ~BlueGrass();
virtual string get_name() const;
};
BlueGrass::BlueGrass(){
Grass::set_name( "bluee_grass" );
}
BlueGrass::~BlueGrass(){
}
string BlueGrass::get_name() const{
return Grass::get_name();
}
///////////////////////
class PurpleGrass:virtual public Grass{
public:
PurpleGrass();
virtual ~PurpleGrass();
virtual string get_name() const;
};
PurpleGrass::PurpleGrass(){
Grass::set_name( "purple_grass" );
}
PurpleGrass::~PurpleGrass(){
}
string PurpleGrass::get_name() const{
return Grass::get_name();
}
class Tree: public BlueGrass, public PurpleGrass{
public:
Tree(){
BlueGrass::set_name( "tree" );
}
virtual ~Tree(){
}
virtual string get_name() const{
return PurpleGrass::get_name();
}
};
//*/
void trace(const Grass& g){
string str = g.get_name();
cout<<"name: "<<str<<endl;
}
void trace(const Tree& g){
string str = g.get_name();
cout<<"name: "<<str<<endl;
}
void trace(string str){
cout<<"info: "<<str<<endl;
}
int main(int argc, char *argv[])
{
vector<int> ls;
ls.push_back(1);
//
Grass g;
trace(g);
BlueGrass blue_g;
Grass* gg = new Grass();
if(typeid(*gg)==typeid(Grass)){
trace("yes");
}else{
trace("no");
}
trace(blue_g);
Tree tr;
trace(tr);
//
system("PAUSE");
return EXIT_SUCCESS;
}
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
class Grass{
public:
Grass():_name("grass"){
};
virtual ~Grass(){};
virtual string get_name() const;
void set_name(string str);
private:
string _name;
};
string Grass::get_name() const{
return _name;
}
void Grass::set_name(string str){
_name = str;
}
class BlueGrass:virtual public Grass{
public:
BlueGrass();
virtual ~BlueGrass();
virtual string get_name() const;
};
BlueGrass::BlueGrass(){
Grass::set_name( "bluee_grass" );
}
BlueGrass::~BlueGrass(){
}
string BlueGrass::get_name() const{
return Grass::get_name();
}
///////////////////////
class PurpleGrass:virtual public Grass{
public:
PurpleGrass();
virtual ~PurpleGrass();
virtual string get_name() const;
};
PurpleGrass::PurpleGrass(){
Grass::set_name( "purple_grass" );
}
PurpleGrass::~PurpleGrass(){
}
string PurpleGrass::get_name() const{
return Grass::get_name();
}
class Tree: public BlueGrass, public PurpleGrass{
public:
Tree(){
BlueGrass::set_name( "tree" );
}
virtual ~Tree(){
}
virtual string get_name() const{
return PurpleGrass::get_name();
}
};
//*/
void trace(const Grass& g){
string str = g.get_name();
cout<<"name: "<<str<<endl;
}
void trace(const Tree& g){
string str = g.get_name();
cout<<"name: "<<str<<endl;
}
void trace(string str){
cout<<"info: "<<str<<endl;
}
int main(int argc, char *argv[])
{
vector<int> ls;
ls.push_back(1);
//
Grass g;
trace(g);
BlueGrass blue_g;
Grass* gg = new Grass();
if(typeid(*gg)==typeid(Grass)){
trace("yes");
}else{
trace("no");
}
trace(blue_g);
Tree tr;
trace(tr);
//
system("PAUSE");
return EXIT_SUCCESS;
}
//
从上面的代码中,可以看到在 Tree 类中 设置name用的是BlueGrass的方法,获取name用的是PurpleGrass的方法,但是它们的数据域是同一个。

浙公网安备 33010602011771号