【面向对象编程——多继承】
引入
在继承和派生这一篇中展示的案例都是一个派生类只有一个基类,也就是单继承,可以看作继承单(只继承一个基类)。
顾名思义,当一个派生类继承于多个基类的时候就是多继承。
class monkey :public animal
之前单继承时创建派生类是上面这种写法。
如果是多继承的话,只需要在animal后用逗号隔开继续写其它基类就可以了:
class monkey :public animal ,public yuan……
完整代码:
class animal {
public:animal() {cout << "call animal " << endl;}
};class yuan {
public:yuan() {cout << "call yuan " << endl;}
};
//多继承声明派生类
class monkey :public animal ,public yuan {
public:monkey() {cout << "call monkey " << endl;}
};
结果输出:
孙悟空会七十二变,时而变为人,时而变成动物,现在用多继承来实现:
动物类的成员变量有昵称,人类有名字,孙悟空类新增一个性别类。
class animal {
public:animal() {}animal(string name):nickName(name){}
public:string nickName;
};class people {
public:people() {}
protected:string name;people(string name) :name(name){}
};class WuKong:public animal ,public people{
private:char sex;
public:WuKong() {}WuKong(string nickName, string name, char sex) :animal(nickName), people(name), sex(sex){}void printInfo() {cout << this->nickName << " " << this->name << " " << this->sex << endl;}
};int main() {WuKong v("monkey","WuKong",'Y');v.printInfo();return 0;
}
多继承构造函数的调用顺序
比如class WuKong:public animal ,public people这句中,先写的是animal,就先调animal的构造函数,后调people
而对于这句WuKong(string nickName, string name, char sex) :animal(nickName), people(name), sex(sex){}
如果变换animal和people的顺序,输出结果仍为未交换时的结果,因为在这里修改不能改变调用构造函数的顺序。
总之就是调用各类构造函数的顺序取决于声明派生类时各父类的书写先后。
若在声明派生类后面先people再animal,则结果就按先people再animal输出:
变换顺序后输出也跟着改变:
完整代码:
class animal {
public:animal() {cout << "call animal"<<endl;}
};class people {
public:people() { cout << "call people" << endl;}
};
//取决于下面这行的中基类书写的顺序
class WuKong: public animal , public people {
public:WuKong() {cout << "call WuKong" << endl;}
};int main() {WuKong v;return 0;
}
多继承名字冲突
当基类中有相同的构造函数时,需要明确标注要用的是哪个类里面的:
基类 ::构造函数名();
否则就会报错:
可以在派生类里面写一个构造函数,在这个构造函数里面声明是调用哪个类的:
class worker{
public:worker() {}void printInfo() {cout << "worker " << endl;}
};class person {
public:person() { }void printInfo() {cout << "person " << endl;}
};class AI: public worker , public person {
public:AI() {}//在这里添加了funcvoid func() {//需要哪个就具体写出哪个person::printInfo();worker::printInfo();}
};int main() {AI v;v.func();return 0;
}