精华内容
下载资源
问答
  • 继承解决了同类型的类的功能扩展(功能扩展) 继承和接口在这点上是一样的,都可以方便扩展和维护,你将公共的方法定义在父类中,通过继承生成不同特征的子类(接口解决了软件的维护和扩展) 减少代码重复,对于...

    继承解决了同类型的类的功能扩展(功能扩展

    继承和接口在这点上是一样的,都可以方便扩展和维护,你将公共的方法定义在父类中,通过继承生成不同特征的子类(接口解决了软件的维护和扩展

    减少代码重复,对于优化代码优化很有好处(优化

    点击打开链接

    展开全文
  • 用表单提交数据后,程序报There is no Action mapped for namespace [/] and action ... - [unknown location]错后,网上查说要继承ActionSupport,继承之后就不报错,后来我故意不让继承之后也不报错,为什么啊?
  • 本文实例讲述PHP 使用 Trait 解决 PHP 单继承问题。分享给大家供大家参考,具体如下: 什么继承继承实际上是存在于面向对象程序设计中的两个类之间的一种关系,是面向对象程序设计方法的一个重要手段,通过...
  • 什么是菱形继承?  假设有一个类A,它有两个子类,分别为类B和类C,再有一个类D又继承了B类和C类;如图: 类似于这种,有子类对象包含多份父类对象的继承模型称为菱形继承。 上述菱形继承体系中,类D多重继承了类...

        什么是菱形继承?

        假设有一个类A,它有两个子类,分别为类B和类C,再有一个类D又继承了B类和C类;如图:


    类似于这种,有子类对象包含多份父类对象的继承模型称为菱形继承。

    上述菱形继承体系中,类D多重继承了类B和类C,因此,类D含有两份基类A的成员;此种继承方式会造成两个问题:二义性和数据冗余。

    先看一段代码:

    #include<iostream>
    using namespace std;
    
    class A   //基类A
    {
    
    public:
    	int _a;
    };
    
    class B:public A   //子类B
    {
    
    public:
    	int _b;
    };
    
    class C:public A   //子类C
    {
    
    public:
    	int _c;
    };
    
    class D :public B, public C  //多重继承B和C的子类D
    {
    public:
    	int _d;
    };
    
    void test()
    {
    	D d;
    	d._a = 10;
    
    
    }
    
    int main()
    {
    	test();
    
    	system("pause");
    	return 0;
    }
    看一下编译结果:


    可以看到:编译器无法确定_a是属于类B的还是类C的,这就是二义性问题。那如何解决这个问题?

    可以通过添加域的访问限定符解决:

    void test()
    {
    	D d;
    	d.B::_a = 10;
    	d.C::_a = 20;
    	d._b = 30;
    	d._c = 40;
    	d._d = 50;
    }

    看一下是否赋值成功:


    从监视窗口可看到,对类B和类C的_a都成功赋值。


    但是还有另一个问题没有解决:数据的冗余。

    因此,引入虚拟继承机制;虚继承可以同时解决菱形继承的二义性和数据冗余的问题。

    我们需要在类B和类C继承基类A时加入virtual,这样保证了在子对象创建时,只保存了基类A的一份拷贝。

    C++使用虚拟继承,解决了从不同路径继承来的相同基类的数据成员在内存中有不同的拷贝造成数据不一致的问题,将共同基类设置为虚基类,这时从不同路径继承的虚基类在内存就只有一个映射。

    #include<iostream>
    using namespace std;
    
    class A
    {
    
    public:
    	int _a;
    };
    
    class B:virtual public A
    {
    
    public:
    	int _b;
    };
    
    class C :virtual public A
    {
    
    public:
    	int _c;
    };
    
    class D :public B, public C
    {
    public:
    	int _d;
    };
    
    void test()
    {
    	D d;
    	d._a = 10;
    	d._a = 20;
    	d._b = 30;
    	d._c = 40;
    	d._d = 50;
    }
    
    int main()
    {
    	test();
    
    	system("pause");
    	return 0;
    }
    
    看一下监视窗口:



    可以发现_a被赋值为20,并没有10的出现,说明在类D的对象模型中只存在一个_a。

    在探索菱形虚拟继承的实现原理前,我们分别看一下派生类D的大小和菱形虚拟继承派生类D的大小:


    菱形继承派生类D的大小:



    菱形虚拟继承派生类D的大小:



    可以看到两者的区别:菱形虚拟继承比菱形继承多了四个字节的大小。

    我们可以通过内存看一下菱形虚拟继承中派生类D的对象在内存中的情况:


    通过内存可以看出基类A的成员变量_a在类D中只有一份,因此也已经解决了数据冗余的问题;但是,内存中蓝色框中的地址存的是什么呢?

    我们称它为虚基表地址。可以看下这个地址存放的是什么:


    总图:





    下面我们可以看一下菱形继承的对象模型和菱形虚拟继承对象模型:

    菱形继承对象模型:

    菱形虚拟继承对象模型:

    总结:

            虚拟继承虽然解决了菱形继承的产生的二义性和数据冗余问题,但是如同上述的例子为了解决一个int数据冗余,却开辟了两个存放虚基表的空间;而且访问虚基类数据时,要通过虚基表进行间接访问,效率就会比较低,带来了性能上的损耗,所以非必要的时候尽量避免菱形继承,尝试换一种设计模式(但是当数据冗余的程度很大时,使用虚拟继承会更)。



    展开全文
  • 问题是,继承下来的类在同一个程序集里没问题,跨程序集一运行就报错:不识别资源,但愣是没找到相关资源到底在哪设置。 引用后直接new Usercontrol1()当然也是没问题的,抓瞎。 一个简单的示例,不知道这个...
  • 在C++中,什么叫做钻石问题(也可以叫菱形继承问题),怎么避免它? 下面的图表可以用来解释钻石问题。 假设我们有类B和类C,它们都继承了相同的类A。另外我们还有类D,类D通过多重继承...

    在C++中,什么叫做钻石问题(也可以叫菱形继承问题),怎么避免它?


    下面的图表可以用来解释钻石问题。






    假设我们有类B和类C,它们都继承了相同的类A。另外我们还有类D,类D通过多重继承机制继承了类B和类C。因为上述图表的形状类似于钻石(或者菱形),因此这个问题被形象地称为钻石问题(菱形继承问题)。现在,我们将上面的图表翻译成具体的代码:


    /*
    Animal类对应于图表的类A
    */
    								
    class Animal { /* ... */ }; // 基类
    {
    int weight;
    
    public:
    
    int getWeight() { return weight;};
    
    };
    
    class Tiger : public Animal { /* ... */ };
    
    class Lion : public Animal { /* ... */ }	
    						
    class Liger : public Tiger, public Lion { /* ... */ };	

    在上面的代码中,我们给出了一个具体的钻石问题例子。Animal类对应于最顶层类(图表中的A),Tiger和Lion分别对应于图表的B和C,Liger类(狮虎兽,即老虎和狮子的杂交种)对应于D。

    现在,问题是如果我们有这种继承结构会出现什么样的问题。

    看看下面的代码后再来回答问题吧。

    int main( )
    {
    Liger lg ;
    
    /*编译错误,下面的代码不会被任何C++编译器通过 */
    
    int weight = lg.getWeight();  
    }


    在我们的继承结构中,我们可以看出Tiger和Lion类都继承自Animal基类。所以问题是:因为Liger多重继承了Tiger和Lion类,因此Liger类会有两份Animal类的成员(数据和方法),Liger对象"lg"会包含Animal基类的两个子对象。

    所以,你会问Liger对象有两个Animal基类的子对象会出现什么问题?再看看上面的代码-调用"lg.getWeight()"将会导致一个编译错误。这是因为编译器并不知道是调用Tiger类的getWeight()还是调用Lion类的getWeight()。所以,调用getWeight方法是不明确的,因此不能通过编译。


    钻石问题的解决方案:


    我们给出了钻石问题的解释,但是现在我们要给出一个钻石问题的解决方案。如果Lion类和Tiger类在分别继承Animal类时用virtual来标注,对于每一个Liger对象,C++会保证只有一个Animal类的子对象会被创建。看看下面的代码:

    class Tiger : virtual public Animal { /* ... */ };
    
    class Lion : virtual public Animal { /* ... */ }

    你可以看出唯一的变化就是我们在类Tiger和类Lion的声明中增加了"virtual"关键字。现在类Liger对象将会只有一个Animal子对象,下面的代码编译正常:

    int main( )
    {
    Liger lg ;
    
    /*既然我们已经在Tiger和Lion类的定义中声明了"virtual"关键字,于是下面的代码编译OK */
    
    int weight = lg.getWeight();  
    }


    因为Java不支持多继承,所以不会出现菱形继承问题。但是Java可以通过接口间接实现多重继承。

    Class Mule implements Horse,Donkey
    {
        /* Horse和Donkey是接口*/
    }


    转载自:http://www.programmerinterview.com/index.php/c-cplusplus/diamond-problem/

    展开全文
  • 还可以继承父元素的事件,所以我们可以利用这个原理来实现只给父元素添加一个事件,所有的子元素也相继有这个事件,但是会有一个问题,当我们触发子元素父元素也会触发该事件,这就很头疼,有什么办法可以解决...
           子元素不仅可以继承父元素的样式,还可以继承父元素的事件,所以我们可以利用这个原理来实现只给父元素添加一个事件,所有的子元素也相继有了这个事件,但是会有一个问题,当我们触发了子元素父元素也会触发该事件,这就很头疼了,有什么办法可以解决这个问题呢?当然有,只要给每个子元素都取消冒泡就可以了,e.stopPropagation();


    展开全文
  • Servlet技术就解决了这一问题,在编写逻辑代码时,要根据服务器提供的接口来进行编写(extends HttpServlet,并实现service方法),将逻辑代码放入服务器中时,服务器就会寻找到继承了它本身提供的HttpServlet的继承...
  • 由于业务需要,需要在 feign 的接口上实现多层继承,开开心心撸完代码,却踩个坑,原来 open-feign 是不支持接口的多层继承与多继承。查看几个解决方案无果,最终在源码的 issues 下找到解决方法。Issues 传送门 ...
  • 面向对象三要素:封装、继承和多态 封装解决了什么问题,带来了什么问题 继承解决了什么问题,带来了什么问题 多态解决了什么问题,带来了什么问题 ...
  • 什么要使用继承? 减少代码重复性       问题引入------- 举例:小猫类,小狗类            当编写小猫类和小狗类时都会写姓名,吃,叫等方法,导致两段代码大量重复。且维护性不高(维护性主要是...
  • Java有了继承,为什么还要接口

    千次阅读 2017-03-03 10:19:54
    显示世界里有多重继承的需求,如下图。猫和狗分属不同的科目,但是它们都是宠物。...为解决以上问题,Java引入接口这个方式,接口实际是是一个纯的只具有抽象方法的集合,它没有任何实现,不会导致
  • 1)C++中的多继承感觉设计不清晰,同时可能会有二义性问题的产生(虽然在C++中已经通过虚基类和类名限定解决问题) 2)JAVA中的但继承更适合于设计,符合现实,因为有些东西它不会既有这个东西的一些特性又有另外...
  • 1,为什么要设计内部类,它解决了什么问题?设计的目的是什么? 如果想让一个类继承多个接口(可以多继承接口)继承多个抽象类是做不到。但是在设计比较复杂的时候需要继承多个接口或者抽象类,总不能全部功能写在...
  • 在前边的博客中我提到过菱形继承问题,也给出几种解决菱形继承的方法 https://blog.csdn.net/liu_zhen_kai/article/details/81590467 但是给的方法没有说明原因,这篇博客将会从内存存储模型角度,以及虚继承...
  • 今天一个同学遇到一个问题,是这样的:她写一个继承QLabel的派生类,重写里面的paintEvent函数,创建对象并set图片进去,编译没错,正常运行,结果就是那个label什么都没有显示出来.
  • 第一次写博客,有什么问题或者想法的希望各位可以进行评论交流,望大家多多包涵! 遇到的问题是在新建的项目都出错,出现support_v7下面出现红线及解决方法及为什么eclipse中项目继承ActionBarActivity: 主要是...
  • 首先我们要了解:什么是向下转型和向上转型。 面向对象的转型只会发生在具有继承关系的父子类中(接口也是继承的一种) 向上转型:其核心目的在于参数的统一上,根本不需要强制类型转换。 向下转型:是为了操作子类...
  • 设计模式之美 - 05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?封装(Encapsulation)抽象(Abstraction)继承(Inheritance)多态(Polymorphism)重点回顾课堂讨论 上一节课,我简单介绍面向...
  • 虚基类和多重继承什么是多重继承多重继承的优点关于菱形继承问题其他多重继承的情况如何解决多重继承问题什么是虚基类虚基类如何解决问题查看虚基类的内存布局对比普通继承下的内存布局 什么是多重继承 多重继承...
  • 继承

    2021-04-26 20:12:18
    1. 继承 1.1 继承的入门(掌握) 问题 什么继承? 有什么好处? ...什么继承?...让类与类之间产生关系, ...继承主要解决问题就是 抽象子类共性的内容 实现继承的格式 继承通过extends实现 格式:class 子类 exten
  • 今天学习telent的时候,发现telnet默认访问的路径是web默认路径,于是我在我的浏览器...写到这,我就百度一下options控制什么的,然后我再总结一下它的作用。 Options指令是Apache配置文件中一个比较常见也比
  • 虚函数 虚函数的存在说明C++的多态性 实现的方法:父类指针指向子类对象,调用虚函数,调用的是子类的虚函数 (如果没有虚函数,那么无论用父类指针... 什么函数不能是虚函数(只有成员函数才能是虚函数)...
  • 第二,存在二义性问题,通常可以将派生类对象的地址赋值给基类对象,实现的具体方式是,将基类指针指向继承类(继承类有基类的拷贝)中的基类对象的地址,但是多重继承可能存在一个基类的多份拷贝,这就出现二义性...
  • java.io.FilePermission类被定义为final类-------意味着该类不能被继承, 不能被扩展. 我们学程序的都知道 这样的类不算合格但是 OpenJDK为什么放弃可扩展性? 在Java的安全管理模式下, 一个用户通常...
  • 阿里巴巴的RocketMQ基于Kafka的原理,利用Java代码打造,弥补Kafka的缺点,继承了其高吞吐的优势,其客户端目前以Java为主。 RabbitMQ基于面向并发的语言Erlang开发,吞吐量不如Kafka,但是消息可靠性较好。也能...
  • 展开全部Python支持多继承,与C++一样都会出现一种问题:子类继承的多个父类又继承了同一个e69da5e6ba9062616964757a686964616f31333363393735父类,这时就有可能会出现父类构造方法被调用多次的情况。关于这个问题...
  • 最近自己写了一个移动端滑动的插件,在用jquery写面向对象继承的时候发现了很多问题,自己解决了一些,但对于obj.call(this)这个东西有很多疑问 function a(obj1,obj2,arr){ this.obj1=obj1; this.obj2=this.obj...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,652
精华内容 660
关键字:

继承解决了什么问题