精华内容
下载资源
问答
  • 5.4多重继承

    2018-12-16 17:47:40
    和多重派生构造函数有什么区别? 前面所有所讨论的是一个一个继承下来,是单继承 而多重继承是一个派生类从个基类继承 一、多重继承的继承方法 class D : public A, private B, protected C { ...... //类D...

    多重继承?和多重派生构造函数有什么区别?

    前面所有所讨论的是一个一个继承下来,是单继承

    而多重继承是一个派生类从多个基类继承

    一、多重继承的继承方法

    class D : public A, private B, protected C
    {
        ......      //类D中新增加的成员
    };

     

    二、多重继承派生类的构造函数

    class D : public A, private B, protected C //基类调用顺序由这个所写先后顺序决定
    {
        public:
            D(总参数表) :A(参数表), B(参数表), C(参数表)
            {
                派生类中新增数据成员初始化语句
            }
        private:
            B b;
            A a;
    };

    如前面所说一样,这里是先调用基类构造函数,再调用子对象构造函数,最后调用派生类构造函数

    这里也没什么好提的,注意一点即可:

    在调用基类构造函数时,是按照基类出现的顺序调用的,比如这里调用顺序是A,B,C

    在调用子对象构造函数时,是按照子对象声明的先后顺序调用的,比如这里调用顺序是B,A

     

    三、多重继承引起的二义性

    什么是二义性?当继承时碰到名字相同的数据成员或成员函数怎么办?这就是多重继承出现的二义性

    有人说既然重名会出错那不重名不就行了

    将所有基类中相同的成员改的不一样这的确是一个简单快速通用的方法

    如果一定要相同呢?

    1.多个基类重名

    class A
    {
        public:
            int a;
            void display();
    };
    
    class B
    {
        public:
            int a;
            void display();
    };
    
    class C : public A, public B
    {
        public:
            int b;
            void show();
    };

    当继承时多个基类内有重名成员,在调用时到底调用哪一个基类的成员?这时就会出现错误

    有一种方法不会出错,那就是在调用类名时在所调用成员前加上类名限制,如:

    C c1;
    c1.A::a = 3;
    c1.B::display();

    2.多个基类和派生类某些成员有相同的名字

    class A
    {
        public:
            int a;
            void display();
    };
    
    class B
    {
        public:
            int a;
            void display();
    };
    
    class C : public A, public B
    {
        public:
            int a;
            void display();
    };
    C c1;
    c1.a = 3;
    c1.display();

    这时调用的是哪个类中的呢还是会出错呢?

    程序这时不会出错,而是调用派生类C中的成员

    因为基类的同名成员在派生类中被屏蔽,成为“不可见”的,或者说,派生类新增加的同名成员覆盖了基类中的同名成员(注意:对于成员函数来说,如果名字相同但参数不同是不会发生覆盖的,这就属于到函数的重载中了)

     

    三、虚基类解决特殊多重继承问题

    如果有一个类为A,以A为基类派生出B类和C类,然后又以B类和C类为基类派生出C类

    那么问题来了,当B类和C类共同继承A类时一定会出现名字相同的成员继承下来,那么再继承到C类后重名的怎么办

    这里除了用二中的方法外,还有一种特殊的解决方法,那就是运用虚基类

    虚基类一般形式为

    class 派生类名 : virtual 继承方式 基类名
    {
    }

    所以如以下代码所示

    class A
    {
        public:
            A(int i)            //A类的构造函数
            {
                a = i
            }
            int a;
    };
    
    class B : virtual public A
    {
        public:
            B(int i) : A(i)              //B类的构造函数
            {
            }
    };
    
    class C : virtual public A
    {
        public:
            C(int i) : A(i)              //C类的构造函数
            {
            }
    };
    
    class D : public B, public C
    {
        public:
            D(int i) : A(i), B(i), C(i)            //D类的构造函数
            {
            }
    };

    这样就解决了重名问题

    注意这里D类还是把B类、C类同名的成员都继承了下来,但是当调动的时候只使用一份

    而且为了保证虚基类在派生类中只继承一次,应当在该基类的的所有直接派生类中声明为虚基类,否则还会出现多次继承

    对于虚基类的初始化,在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化

    展开全文
  • 不是的话有什么替代方法? cocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理来实现的。你不用去考虑繁琐的多继承,虚基类的概念。多态特性在 obj-c 中通过委托来实现。 线程与进程的区别...
    obj-c有多重继承么?不是的话有什么替代方法? 
    cocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理来实现的。你不用去考虑繁琐的多继承,虚基类的概念。多态特性在 obj-c 中通过委托来实现。
    线程与进程的区别和联系?
    进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

    进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
    自动释放池是什么,如何工作?
    当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

    1. ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.
    2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的.
    3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一。

    什么是KVC和KVO?答:KVC(Key-Value-Coding)内部的实现:一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。KVO(Key-Value-Observing):当观察者为一个对象的属性进行了注册,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是真实的类。所以isa指针其实不需要指向实例对象真实的类。所以我们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名。
    展开全文
  • 不是的话有什么替代方法? cocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理来实现的。你不用去考虑繁琐的多继承,虚基类的概念。多态特性在 obj-c 中通过委托来实现。 线程与进程的区别...


    http://lizaochengwen.iteye.com/blog/1443255



    obj-c有多重继承么?不是的话有什么替代方法?
    cocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理来实现的。你不用去考虑繁琐的多继承,虚基类的概念。多态特性在 obj-c 中通过委托来实现。
    线程与进程的区别和联系?
    进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

    进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
    自动释放池是什么,如何工作?
    当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

    1. ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.
    2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的.
    3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一。

    什么是KVC和KVO?答:KVC(Key-Value-Coding)内部的实现:一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。KVO(Key-Value-Observing):当观察者为一个对象的属性进行了注册,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是真实的类。所以isa指针其实不需要指向实例对象真实的类。所以我们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名。

    展开全文
  • 接口抽象类有什么区别

    千次阅读 热门讨论 2018-08-26 21:32:21
    java,C#等高级语言都是不支持继承个父类的,因为多重继承很复杂,很容易产生问题,在具体的我就说不出来了!单重继承有很拘束,因为有些具体的方法父类没有!这该怎么半呢,高级语言中的接口就出现了,它解决了单...

    前言:

    接口和抽象类来两个东西很抽象,很相似,但是二者之间到底有何关系,有了抽象类可以满足编程的基本需求了,为什么又会出现接口,接下来是小编的一些个人理解!

    java,C#等高级语言都是不支持继承多个父类的,因为多重继承很复杂,很容易产生问题,在具体的我就说不出来了!单重继承又很拘束,因为有些具体的方法父类没有!这该怎么办呢,高级语言中的接口就出现了,它解决了单重继承的缺点!

    接下来举个例子,一个抽象类人,然后我将它实例化成具体的人——小明,小明就有了一般人的具体的行为,比如可以走路,说话,看电影。。。。。但是一般的人不会做饭,我想给小明加一项技能——做饭,这该怎么办呢,这时候哦就可以通过接口给小明加上一项技能——做饭!完美,此时小明又想学习钢琴,没关系,在继续找一个钢琴的接口,去实现它就好了,这时候小明就会了弹钢琴!

    上面是一个简单的例子,通过这个例子我们可以看出**接口是对动作的抽象,抽象类是对根源的抽象**

    接下来做一些小的总结:

    1.抽象类 和 接口 都是用来抽象具体对象的. 但是接口的抽象级别最高
    2.抽象类可以有具体的方法 和属性, 接口只能有抽象方法和不可变常量
    3.抽象类主要用来抽象类别,接口主要用来抽象功能.
    4、抽象类中,且不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的。

    展开全文
  • abstract classinterface有什么区别

    万次阅读 2017-04-24 20:47:05
    可以通过继承个接口实现多重继承 一个类可以实现个interface数据成员 可以自己的 静态的不能被修改即必须是static final,一般不在此定义方法 可以私有的,非abstract方法,必须实现 不可私有的,默认是publ
  • 时候我们确实需要继承个类,比如希望拥有两个类的行为功能,就很难使用单继承来解决问题了(当然多层继承是可以解决的),那么我们还可以用什么办法来解决多重继承的问题呢?没错!用内部类!下面介绍一个案例...
  • java室友c 发展而来,与c 类似之处,不过java更加清晰、规模较小,容易学习。经过高手们的加工,java从根本上解决了c 的固有...C 支持多重继承,它允许父类派生一个子类。也就是说,一个类允许继承个父类。...
  • 抽象类接口有什么区别

    千次阅读 2008-09-27 10:28:00
    简单来说, 接口是公开的,里面不能私有的方法或变量,是用于让别人使用的,而... 还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承个接口实现多重继承,接口还有标识(里面没有任何方法,
  • 1.都是面向对象的语言,都支持封装、继承和多态 2.指针:Java不提供指针来直接访问内存,程序更加安全 3.继承:Java的类是单继承的,C++支持多重继承;Java通过一个类实现个接口来实现C++中的多重继承;Java中类不...
  • 区别,首先是托管非托管的区别,托管代码不允许进行对内存的操作,而是由固定的垃圾回收机制来完成,而C++则不然。其次C#不需要这样一个平台。最后C#是完全面向对象的,C#的世界里万物皆是类,不存在一个超越...
  • 1.在c++中有继承和多重继承,而java中只有单继承。继承的好处在于可以复用一些东西,但缺陷在于后续不好扩展。此外,可读性方面继承也不好。 2.java中了一个接口的概念,而接口的功能和其名字表达的一样,就是在...
  • 自己在看java线程的时候,经常看到人收runnablethread中这么一条,runnable是接口,我们可以实现个接口,如果直接继承thread的话,是不能多重继承类的,但是我不明白的一点是,直接继承thread我们依旧可以...
  • 接口抽象类的区别

    2018-09-04 18:46:33
    1 因为java不支持多重继承,所以了接口,一个类只能继承一个父类,但可以实现个接口, 接口本身也可以继承个接口。 2 接口里面的成员变量默认都是public static final类型的。必须被显示的初始化。 ...
  • 小伙伴在学习之前都会去纠结,Java和C++到底有什么区别呢?包括面试的时候,面试官也会经常问道Java和C++比,所以没办法!!!就算没学过,也要记下来! 1:都是面向对象的语言,都支持封装、继承和多态 2:...
  • 抽象类接口的区别

    2018-03-01 14:15:00
    什么时候使用抽象类接口?  如果你拥有一些方法并且想让它们中的一些默认实现,那么使用抽象类吧。如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个...
  • 抽象类接口区别不是很明显,除了多重继承外,感觉抽象类完全可以替代接口,个人感觉在于你要做什么用,抽象类为了代码复用性,接口为了实现态性,你可以想一想你要用这两个的初衷是什么来决定 不过抽象类如下:...
  • 什么时候使用抽象类接口? (1)拥有一些方法并且想让它们中的一些默认实现,使用抽象类。 (2)想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此...
  • 什么时候使用抽象类接口 如果你拥有一些方法并且想让它们中的一些默认实现,那么使用抽象类吧。 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口...
  • extendsimplements有什么不同? 1.对于class而言,extends用于(单)继承一个类(class) public class OtherActivity extends Activity{ } 2.implements用于实现接口(interface),Java可通过接口实现多重...
  • python中的类分为新式类经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要。 Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Python 3.x中默认都是新式类,不必显式...
  • 11、"=="equals方法究竟有什么区别? 11 12、静态变量实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math....
  • C# 什么是委托?委托事件是什么关系? 什么是反射? ...C#中是否可以从个类中继承?...stringStringBuilder有什么区别? constreadonly的区别? new、virtual、abstract、override、sealed的区别? ...
  • stringStringBuilder有什么区别?constreadonly的区别?new、virtual、abstract、override、sealed的区别?abstract classinterface有什么区别?公共变量与属性的区别?结构与类的区别? ASP.NETASP.
  • 不能够实现多继承,这里延伸出来就是C++的知识,C++是支持多重继承的 可以实现多个接口,通过实现多个接口可以完成类似于C++的多重继承功能(protocol或者category) Category是分类,或者说是类别 用分类好,因为对...
  • 2020面试题 iOS

    2020-07-28 15:51:48
    3、#import跟 #include 有什么区别,@class呢,#import<> 跟 #import“”有什么区别? 4、frame bounds 有什么不同? 5、Objective-C的类可以多重继承么?没有的话用什么代替?可以实现个接口么?...
  • iOS经典面试题 (一)

    2016-04-25 17:07:00
    Objective-C经典面试题 1、Objective-C的类可以多重继承么?可以采用个协议么?OC语言的基本特点是什么? 多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能。...跟#import""有什么...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 145
精华内容 58
关键字:

多继承和多重继承有什么区别