解决方案
5
java不允许多重继承,所以java没有虚继承的概念
只有在虚继承的情况下,才把父类叫虚基类,实际上父类仍然是个普通父类,真正做出实现的是继承类
抽象基类只是不允许实例化,就像你把一个普通类的构造函数声明成protected一样,它是一种能带数据的接口
虚继承是用于解决多重继承的,并不是接口逻辑,你概念混淆得很重
只有在虚继承的情况下,才把父类叫虚基类,实际上父类仍然是个普通父类,真正做出实现的是继承类
抽象基类只是不允许实例化,就像你把一个普通类的构造函数声明成protected一样,它是一种能带数据的接口
虚继承是用于解决多重继承的,并不是接口逻辑,你概念混淆得很重
5
接口逻辑指的是回调,回调指的是函数,和数据的逻辑结构没有任何关系,由于面向对象设计用虚函数代替,所以接口才和对象扯上关系
c++普通继承的逻辑是组合,而虚继承的逻辑是装饰,这三代的继承才会体现出来,java的abstract分别派生出两个子类后,这两个子类不能派生出一个孙子类,所以这是不可比的
虚继承不是为了修正普通基础的“缺陷”,这两个是不同的逻辑,而数据的继承和虚函数的复写也是不同的逻辑
c++普通继承的逻辑是组合,而虚继承的逻辑是装饰,这三代的继承才会体现出来,java的abstract分别派生出两个子类后,这两个子类不能派生出一个孙子类,所以这是不可比的
虚继承不是为了修正普通基础的“缺陷”,这两个是不同的逻辑,而数据的继承和虚函数的复写也是不同的逻辑
10
有人没分清虚基类跟抽象基类的概念吧,你应该在这个问题上较劲。
有些语言里明确提出区分了接口和类的概念,用了不同的关键字。
而C++里并没有完全地分开这两玩意儿,反正都是类,只要有至少一个成员函数是虚的,就会有一个虚函数表,派生类重载后实现多态,从某种层面上说这个虚方法也可以叫接口方法。
像其它语言中接口就是接口,全部方法只有声明没有实现。而C++中的抽象类是指至少有一个纯虚函数方法的类,即可以成员函数全部为纯虚,可以部分为纯虚部分有实现。
关键还是看具体做什么。
有些语言里明确提出区分了接口和类的概念,用了不同的关键字。
而C++里并没有完全地分开这两玩意儿,反正都是类,只要有至少一个成员函数是虚的,就会有一个虚函数表,派生类重载后实现多态,从某种层面上说这个虚方法也可以叫接口方法。
像其它语言中接口就是接口,全部方法只有声明没有实现。而C++中的抽象类是指至少有一个纯虚函数方法的类,即可以成员函数全部为纯虚,可以部分为纯虚部分有实现。
关键还是看具体做什么。