`
longsy
  • 浏览: 137887 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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(); //存在二义性


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

相关推荐

    c++多重继承

    类的多重继承演示&quot;&lt;&lt;endl; CDateTimeType dt 1 1 2008 11 12 12 ; 直接使用DateTimeType构造函数设置日期时间 cout&lt;&lt;&quot;调用CDateTimeType类构造函数设定的初始日期 时间为:&quot;&lt;&lt;...

    C++编程思想--多重继承

    子对象重叠,虚基类,开销,向上映射,避免MI,修复接口

    Java的interface观念与C++多重继承比较

    C++的多重继承功能较广,Java的interface功能只是其中的一个子集。因为C++的虚拟函数可以有纯虚拟函数,也可有非纯虚拟函数,而Java只有抽象函数,所以功能模式少一种,自然能达到的效果较少一些。 但这并不代表Java...

    C++多重继承及多态性原理实例详解

    主要介绍了C++多重继承及多态性原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    C++习题 多重继承

    c++多重继承的一个习题

    实现c++类的多重继承的例程

    实现c++类的多重继承的例程,通过例程学习是最简单最直接的方法。

    C++多重继承引发的重复调用问题与解决方法

    本文实例讲述了C++多重继承引发的重复调用问题与解决方法。分享给大家供大家参考,具体如下: 前面简单介绍了一个C++多重继承功能示例,这里再来分析一个多重继承引发的重复调用问题,先来看看问题代码: #include ...

    C++多重继承二义性原理实例解析

    在派生类中对基类成员访问应该是唯一的,但是在多继承时,可能会导致对基类某成员访问出现不一致的情况,这就是C++多继承中的二义性。 有两种继承的情况会产生多义性 一、如果一个派生类从多个基类派生,而这些基类...

    类的继承第二次作业(多重继承与虚基类)参考答案_C++_teacher_

    定义一个Person 类,结构如下图,为该类添加输入输出流运算符重载。Person 类以Public方式派生出一个Teacher类,数据成员包括:int gh(工号);char* title(职称),为该类添加输入输出流运算符重载,完成有参、无参、...

    多重继承与虚基类

    c++多重继承与虚基类的ppt 讲细致 易懂

    VC8.0上多重继承的内存布局

    VC8.0上多重继承的内存布局

    C++多重继承与虚继承分析

    主要介绍了C++多重继承与虚继承分析,是面向对象程序设计非常重要的知识点,需要的朋友可以参考下

    实现C++类的多重继承

    实现C++类的多重继承,对类的多重继承不太清楚的同学可以下载参考

    C++ 多重继承和虚拟继承对象模型、效率分析

    C++多态通过继承和动态绑定实现。继承是一种代码或者功能的传承共享,从语言的角度它是外在的、形式上的,极易理解。而动态绑定则是从语言的底层实现保证了多态的发生——在运行期根据基类指针或者引用指向的真实...

    C++实现的多重继承功能简单示例

    本文实例讲述了C++实现的多重继承功能。分享给大家供大家参考,具体如下: 多重继承 1. 多重继承即一个类继承了多个基类的属性。 2. 多重继承下派生类的构造函数必须同时负责所有基类构造函数的调用, 3. 派生类构造...

    说说C++多重继承

     多重继承是从多于一个直接基类派生类的能力,多重继承的派生类继承其父类的属性。  class ZooAnimal{  };  class Bear : public ZooAnimal{  };  class Endangered{  };  class Panda : public ...

Global site tag (gtag.js) - Google Analytics