博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Objective-C和C++中的继承及其区别
阅读量:5899 次
发布时间:2019-06-19

本文共 1853 字,大约阅读时间需要 6 分钟。

 

最近在看一个开源项目的代码(iOS上的抽屉式视图MMDrawerController,Github地址:https://github.com/mutualmobile/MMDrawerController),当看到其中一个地方的时候,发现自己的基础知识真是太渣了。。。

问题是这样的:类B有两个实例方法method1和method2,method1中调用了method2;类D继承自类A,并实现了自己的method1和method2,然后在D的method1中通过super调用父类A的method1。那么,最后执行的是父类A的method2还是子类B的method2呢?

 

经过一番验证,自然是得到了答案。然后我有想到了下面几个问题:

  1.  同样学得半吊子的C++里,这种情况是调用method1还是method2来着?
  2.  Objective-C中,如果method2是私有方法,又会如何?
  3.  对于2中的情况,C++中是什么样的?

 

话不多说,针对原先的问题,代码如下:

@interface B : NSObject- (void)method1;- (void)method2;@end @implementation B- (void)method1{    [self method2];}- (void)method2{    NSLog(@"Base method2.");}@end
@interface D : B@end@implementation D- (void)method1{    [super method1];}- (void)method2{    NSLog(@"Derived method2.");}@end

 在main函数中执行:

D *d = [[D alloc] init];[d method1];

结果为:Derived method2. 可以看出,调用的是子类D的method2方法。

 

 

那么,在C++中又会如何呢?同样用代码来说话:

class B {public:    void method1();    void method2();};class D : public B {public:    void method1();    void method2();};void B::method1(){    method2();}void B::method2(){    cout << "B" << endl;}void D::method1(){    B::method1();}void D::method2(){    cout << "D" << endl;}int main(int argc, const char * argv[]){    D *d = new D();    d->method1();        delete d;    return 0;}

执行结果为:B ,调用的是父类的方法。

可是如果要像Objective-C中一样调用子类D的方法,该怎么做呢?虽然我的C++是半吊子,还是想起了虚函数。在父类的method2声明前加上virtual关键字,然后执行的结果就会变成 D 了。

 

(这时会发现,我这个例子和通常C++参考书里讲虚函数的例子有所不同,那些例子类似于:

B *d = new D();d->method2();

即用父类指针指向子类对象,然后调用一个虚函数。

两个例子虽然长得不同,不过本质还是一样的嘛,都是根据对象的实际类型调用相应的方法。)

 

 

好了,进入下一个问题:如果method2是私有方法会如何?

修改代码,注释掉method2得声明:

@interface B : NSObject- (void)method1;//- (void)method2;@end

运行后会发现,调用依然的是子类的方法。虽然method2是私有的,还是被子类覆盖掉了。。。这点需要注意,尤其是在子类化苹果的框架和第三方类库的时候。

然后看C++,如果加了virtual的话,同样会被覆盖,不过private方法谁闲着没事加个virtual呢。

 

 

综上,Objective-C中的方法相当于自动加了virtual(如果要避开这种多态的特性需要进行合理的设计);子类化时需要避免可能对父类私有方法的覆盖。

 

转载于:https://www.cnblogs.com/sinkup/p/3496810.html

你可能感兴趣的文章
区块链:这项颠覆性技术将如何改变未来
查看>>
BOM操作
查看>>
Docker 容器健康检查机制
查看>>
Redis和Memcached的区别
查看>>
ERP群雄逐鹿市场预测
查看>>
边缘计算如何层次化部署?
查看>>
组织为什么没能采用CI和CD
查看>>
黑客通过控制麦克风窃取乌克兰600GB数据
查看>>
格物斯坦:机器人高手决战申城,IRM开启孩子新视界
查看>>
云智慧运维管理沙龙成功落幕 IT监控成亮点
查看>>
存储器市场经历严冬考验 多元化发展是出路
查看>>
MIT实验室主任:可穿戴设备的大数据梦
查看>>
MySQL 8.0.2复制新特性抢鲜看
查看>>
一篇文章学会spring boot(包括jms和hessian的集成)
查看>>
华南理工章熙春:移动应用推动数字校园
查看>>
Linux下c++程序内存泄漏检测代码范例
查看>>
FIDO联盟拥抱政府监管,全面打造安全可信网络
查看>>
Aruba携手中国电信云南公司共建 “智慧校园”
查看>>
zGlue选择 ASE 作为战略制造合作伙伴,加速物联网市场开发
查看>>
BlackNurse新型DoS攻击 15M流量就可以打瘫思科防火墙 思科做出了回应
查看>>