多继承
多继承和单继承差不多,只不过子类继承了两个及两个以上的父类的属性。
下面的例子来看如何多继承。
class doubwm : public men,public women
{
};
好了,这就是虚继承的语法,看起来是很简单的。
虚继承
多继承有利有弊,一般单继承是将与该类有关的属性继承下来在加以填充,而多继承则是将两类或多类不相关的属性相结合,那么不仅会使得开发杂乱,还会浪费空间,因为要同时拷贝两个父类的属性,所以一般不建议用。但是我们如果要使用多继承,不免要涉及覆盖父类的函数和调用父类的属性,所以就有一个问题,如果有两个父类的函数或属性同名,我们选择哪一个呢?
#include<cctype>
#include<iostream>
#include<string>
class person
{
public:
person(std::string name);
protected:
std::string name;
};
class men : public person
{
public:
men(std::string name,std::string work);
void introduct();
protected:
std::string work;
};
class women : public person
{
public:
women(std::string name,std::string love);
void introduct();
protected:
std::string love;
};
class doubwm : public men,public women
{
public:
doubwm(std::string name,std::string work,std::string love);
void introduct();
//protected:
//std::string name;
};
person::person(std::string name)
{
this->name = name;
}
men::men(std::string name,std::string work) : person(name)
{
this->work = work;
}
void men::introduct()
{
std::cout << "大家好,我是" << name <<",我是" << work << "的" << std::endl;
}
women::women(std::string name,std::string love) : person(name)
{
this->love = love;
}
void women::introduct()
{
std::cout << "大家好,我是" << name <<",我的爱好是" << love << std::endl;
}
doubwm::doubwm(std::string name,std::string work,std::string love) : men(name,work),women(name,love),person(name)
{
//this->name = name;
}
void doubwm::introduct()
{
std::cout << "大家好,我是" << /* women::name */ name << ",我是" << work << "的,并且我的爱好是" << love << std::endl; //注意,多继承重名的要(1)指明继承的父类,否则会出现二异性(2)用虚继承的方法
}
int main(void)
{
women w("小红","唱歌");
men m("小明","阿里");
doubwm dou("小贝","腾讯","唱歌");
w.introduct();
m.introduct();
dou.introduct();
return 0;
}
当我们来试图编译该代码时会出现该错误 “doubwm::name" 不明确”,这就是由于我们在使用继承承下来的同名的属性时出现了二义性,不知道调用两个父类中的哪一个
我当时想到了两种方法:
1.直接在这个子类里再定义一个name属性不就好了。
class doubwm : public men,public women
{
public:
doubwm(std::string name,std::string work,std::string love);
void introduct();
protected:
std::string name;
};
但是这样就与继承无关了,还不如不继承,还浪费空间。
2.直接调用两者其中的一个父类的属性name
class doubwm : public men,public women
{
public:
doubwm(std::string name,std::string work,std::string love);
void doubwm::introduct()
{
std::cout << "大家好,我是" << women::name << ",我是" << work << "的,并且我的爱好是" << love << std::endl; //注意,多继承重名的要(1)指明继承的父类,否则会出现二异性(2)用虚继承的方法
}
};
但是另外一个不就没用了,也是浪费资源空间。
最好的方式还是虚继承
- 声明:
class women : virtual public person
{
};
- 示例
#include<cctype>
#include<iostream>
#include<string>
class person
{
public:
person(std::string name);
protected:
std::string name;
};
class men : virtual public person
{
public:
men(std::string name,std::string work);
void introduct();
protected:
std::string work;
};
class women : virtual public person
{
public:
women(std::string name,std::string love);
void introduct();
protected:
std::string love;
};
class doubwm : public men,public women
{
public:
doubwm(std::string name,std::string work,std::string love);
void introduct();
// protected:
// std::string name;
};
person::person(std::string name)
{
this->name = name;
}
men::men(std::string name,std::string work) : person(name)
{
this->work = work;
}
void men::introduct()
{
std::cout << "大家好,我是" << name <<",我是" << work << "的" << std::endl;
}
women::women(std::string name,std::string love) : person(name)
{
this->love = love;
}
void women::introduct()
{
std::cout << "大家好,我是" << name <<",我的爱好是" << love << std::endl;
}
doubwm::doubwm(std::string name,std::string work,std::string love) : men(name,work),women(name,love),person(name)
{
//this->name = name;
}
void doubwm::introduct()
{
std::cout << "大家好,我是" << name << ",我是" << work << "的,并且我的爱好是" << love << std::endl; //注意,多继承重名的要(1)指明继承的父类,否则会出现二异性(2)用虚继承的方法
}
int main(void)
{
women w("小红","唱歌");
men m("小明","阿里");
doubwm dou("小贝","腾讯","唱歌");
w.introduct();
m.introduct();
dou.introduct();
return 0;
}
当声明了虚继承,就不会出现二义性的问题了,name调用的是person类里面的属性。
虚继承的执行过程
虚继承的原理与过程.
这里面讲的很详细。