C++多重继承

1.多重继承定义
class derived_class_name: public base_class_name1,...{//...};
说明:继承列表中的访问级别可以是public,protected,private
2.大多重继承下,派生类的对象包含每个基类的基类子对象
3.构造派生类型的对象包括构造和初始化它的所有基类子对象
4.基类构造函数按照构造在类派生列表中的出现次序调用

示例:

/*
file:animal.h
author:longsy
*/
#include <iostream>

class ZooAnimal {
public:
ZooAnimal(){
std::cout << "ZooAnimal" << std::endl;
}
virtual ~ZooAnimal(){
std::cout << "~ZooAnimal" << std::endl;
}
};

class Bear : public ZooAnimal {
public:
Bear(){
std::cout << "Bear" <<std::endl;
}
virtual ~Bear(){
std::cout << "~Bear" << std::endl;
}
};

class Endangered{
public:
Endangered() {
std::cout << "Endangered" << std::endl;
}
virtual ~Endangered() {
std::cout << "~Endangered" << std::endl;
}
};

class Panda : public Bear, public Endangered {
public:
Panda() {
std::cout << "Panda" << std::endl;
}
virtual ~Panda() {
std::cout << "~Panda" << std::endl;
}
};

测试代码

/*
file:test.cpp
author:longsy
*/
#include "animal.h"

int main()
{
Panda p;
return 0;
}
/*
ZooAnimal
Bear
Endangered
Panda
~Panda
~Endangered
~Bear
~ZooAnimal
*/


5.转换:派生类的指针或引用可以转换为其任意基类的指针或引用
在转换过程中是向上逐渐转换,对于多重继承要注意转换二义性
示例:

/*
file:test1.cpp
author:longsy
*/
#include "animal.h"
#include <iostream>

void shout(const ZooAnimal &animal) {
std::cout << "animal begins to shout!" << std::endl;
}
void shout(const Bear &bear) {
std::cout << "the bear is shouting!" << std::endl;
}
int main()
{
Panda p;
shout(p); //shout(const Bear &bear)
return 0;
}

二义性示例:

/*
file:test2.cpp
author:longsy
*/
#include "animal.h"
#include <iostream>

void shout(const Bear &bear) {
std::cout << "the bear is shouting!" << std::endl;
}
void shout(const Endangered&) {
std::cout << "the endangered is shouting!" << std::endl;
}
int main()
{
Panda p;
shout(p); //error:存在二义性
return 0;
}


6.多重继承下的多态(虚函数的调用)
同时多重继承下也会出现二义性
示例:

/*
file:animal.h
author:longsy
*/
#include <iostream>

class ZooAnimal {
public:
ZooAnimal(){
std::cout << "ZooAnimal" << std::endl;
}
virtual ~ZooAnimal(){
std::cout << "~ZooAnimal" << std::endl;
}

virtual void shout() {std::cout <<"animal shout" << std::endl;}
};

class Bear : public ZooAnimal {
public:
Bear(){
std::cout << "Bear" <<std::endl;
}
virtual ~Bear(){
std::cout << "~Bear" << std::endl;
}
//如果基类指明了vritual,这里的vritual可以省略
virtual void shout() {
std::cout <<"bear shout" << std::endl;
}
};

class Endangered{
public:
Endangered() {
std::cout << "Endangered" << std::endl;
}
virtual ~Endangered() {
std::cout << "~Endangered" << std::endl;
}
};

class Panda : public Bear, public Endangered {
public:
Panda() {
std::cout << "Panda" << std::endl;
}
virtual ~Panda() {
std::cout << "~Panda" << std::endl;
}

};



测试代码

/*
file:test3.cpp
author:longsy
*/
#include "animal.h"

int main()
{
ZooAnimal *animal = new Panda();
animal->shout(); //bear shout
delete animal; //对于new出现的对象一定要手动地delete
return 0;
}

多态二义性示例代码
在上面Endangered类也添加如下代码:

class Endangered {
//...
virtual void shout() {
std::cout <<"endangered shout" << std::endl;
}
};

测试代码

Panda p;
p.shout(); //存在二义性


解决在多重继承下,对不同基类而同一数据多次继承的问题:使用虚继承
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值