如何解决多重继承

作者:神秘网友 发布时间:2020-10-19 09:34:03

如何解决多重继承

如何解决多重继承

例1

#include<iostream> 
using namespace std;

class A{
	public:
		void f();
};

class B{
	public:
		void f();
		void g();
};

class C : public A,public B{
	public:
		void g();
		void h();
};


int main(){
	
	C c1;
	c1.f();//具有二义性
	c1.g();//无二义性(同名覆盖)
	return 0;
}
具有二义性的错误显示(看下图的error部分)

如何解决多重继承

解决方案

1、类名限定

c1.A::f();
c1.B::f();

2、同名覆盖

在class C中声明一个同名函数,该函数根据需要内部调用A的f()或者B的f()

例2

#include<iostream> 
using namespace std;

class B{
	public:
		int b;
};

class B1:public B{
	private:
		int b1;
};

class B2:public B{
	private:
		int b2;
};


class C : public B1,public B2{
	public:
		int f();
	private:
		int d;
};


int main(){
	
	C c1;
	c1.B1::b;//可以
	c1.B::b;//不行基类存在二义性(报错见下图)
	return 0;
}

如何解决多重继承

例2这种情况的解决方案(虚基类)
虚基类:用于有共同基类的场合

声明
virtual修饰说明基类
主要用来解决多继承时,可能对同一基类继承,继承多次从而产生的二义性
为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝

注意:需要再第一次继承的时候就要讲共同的基类设计为虚基类
具体改进代码见下面
#include<iostream> 
using namespace std;

class B{
	public:
		int b;
};

class B1: virtual public B{//改进处
	private:
		int b1;
};

class B2: virtual public B{//改进处
	private:
		int b2;
};


class C : public B1,public B2{
	public:
		int f();
	private:
		int d;
};


int main(){
	
	C c1;
	c1.B::b;//正确
	return 0;
}
补充
虚基类及其派生类构造函数
建立对象时所指定的类称为最(远)派生类
1、虚基类的成员是由派生类的构造函数 通过 调用虚基类的构造函数进行初始化的
2、在整个继承结构中,直接或者间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。
如果未列出,则表示调用该虚基类的缺省构造函数(default constructor就是默认构造函数)
3、在建立对象时,只有最派生类的构造函数调用虚基类的构造函数,该派生类的其他基类对虚基类的构造函数的调用被忽略
上诉描述过程见下面代码
#include<iostream> 
using namespace std;

class B{
	public:
		B(int n){
			nv = n;
			cout<<"I am B,my num is "<<nv<<endl;
		}
		
		void fun(){
			cout<<"Member of B"<<endl;
		}
	
	private:
		int nv;
};

class B1: virtual public B{
	public:
		B1(int x,int y):B(y){
			nv1 = x;
			cout<<"I am B1,my num is"<<nv1<<endl;
		}
	private:
		int nv1;
};

class B2: virtual public B{
	public:
		B2(int x,int y):B(y){
			nv2 = x;
			cout<<"I am B2,my num is"<<nv2<<endl;
		}
	private:
		int nv2;
};


class C : public B1,public B2{
	public:
		C(int x,int y,int z,int k):B(x),B1(y,y),B2(z,y){
			nvc = k;
		}
	private:
		int nvc;
};


int main(){
	
	C c1(1,2,3,4);
	c1.fun();
	return 0;
}

如何解决多重继承

断点位置

如何解决多重继承

经过调试
单步调试

如何解决多重继承
如何解决多重继承
如何解决多重继承

然后就不能调试了(暂时还不知道原因????)
若是采用单步跳过

如何解决多重继承

直接跳到了55行代码,然后【单步调试】又调用基类中的函数

如何解决多重继承

然后就不能调试了(暂时还不知道原因????)

参考博客

如何解决多重继承相关教程

  1. Spring的三级缓存解决循环依赖示例

    Spring的三级缓存解决循环依赖示例 Spring中为了解决Bean之间的循环依赖引入了三级缓存机制,本文通过对Spring源码的阅读,写出一个简易版的三级缓存机制,代码的整体结构如下: 一、创建2个相互依赖的bean @Component@Aopclass BeanA { @Resource private Bea

  2. 使用Fiddler工具抓取微信小程序无法抓取问题解决

    使用Fiddler工具抓取微信小程序无法抓取问题解决 看到这篇文章的人应该都是手机WIFI代理后,使用Fiddler可以抓其他包,而无法抓微信小程序的人。 为什么手机明明已经添加了信任证书,什么都可以访问,但偏偏小程序无法访问网络呢? 问题一: 小程序无法抓包

  3. GridView 你怎么那么皮——从需求出发,如何让 GridView 的尺寸

    GridView 你怎么那么皮——从需求出发,如何让 GridView 的尺寸不再难以控制 ListView 和 GridView 是我们在开发过程中经常使用的控件。前者用来绘制一个具有动态 item 的固定方向的列表,后者用来显示一个宫格的瀑布流。它们的 item 是一个个独立的布局,我

  4. 如何在Jedis上连接服务器上的Redis

    如何在Jedis上连接服务器上的Redis 如何在Jedis上连接服务器上的Redis 我们在首次使用Jedis连接服务器Linux上的Redis时,可能会遇到如下错误 Exception in thread main redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to host

  5. 解决Exception in thread “main“ com.mysql.jdbc.exceptions.j

    解决Exception in thread “main“ com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications 这个问题出现的原因是在数据库连接失败,从网上查了下,解决的方法五花八门,有改配置文件的,还有改代码的。但是每个人实质原因不同也会出现同

  6. PySpider从下载到运行不了的解决方案

    PySpider从下载到运行不了的解决方案 首先,学习到了PySpider这一板块,但是这一板块卡了我一个多星期,原因就是下载,下载PySpider历经千磨万难,终于下好了。 这个问题解决方法: pip install --upgrade pippip install --upgrade setuptools 这里需要谨慎

  7. Spring Data JPA 无法自动创建数据库表(踩坑已解决)

    Spring Data JPA 无法自动创建数据库表(踩坑已解决) 1、检查配套注解是否添加 @Entity //数据库字段与实体属性对应的能力 @Table(name = t_blog) //生成t_blog数据表 @Id //代表主键 @GeneratedValue(strategy = GenerationType.IDENTITY) //生成策略,自动

  8. 平面内有N个点,如何快速求出距离最近的点对?

    平面内有N个点,如何快速求出距离最近的点对? 大家好,我们今天来看一道非常非常经典的算法题—— 最近点对问题 。 这个问题经常在各种面试当中出现,难度不低,很少有人能答上来。说实话,我也被问过,因为毫无准备,所以也没有答上来。是的,这道题有点神