博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中的多态和Objective-C中的“多态”
阅读量:6861 次
发布时间:2019-06-26

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

C++中的多态(两种):

编译时匹配:函数重载,依据成员函数的名字、形参类型、形参个数等不同来实现不同的函数调用匹配;

运行时匹配:虚函数,具体就是通过将父类或抽象类声明时成员函数声明为virtual,然后子类继承并实现,应用时,通过将子类对象地址赋给其父类类型的指针(注,抽象类不能实例化,即不能定义对象,但是可以定义指向该类类型的指针和引用),通过调用赋值后的父类指针指向的虚函数来达到调用不同子类对该虚函数的不同实现的目的。

C++中实现运行时多态使用virtual.

Obiective-C中实现“多态”使用protocol. 具体请看如下实例,(实例摘自《Objective-C Beginner's Guide》)

Printing.h

@protocol Printing-(void) print;@end
Fraction.h

#import 
#import "Printing.h"@interface Fraction: NSObject
{ int numerator; int denominator;}-(Fraction*) initWithNumerator: (int) n denominator: (int) d;-(void) setNumerator: (int) d;-(void) setDenominator: (int) d;-(void) setNumerator: (int) n andDenominator: (int) d;-(int) numerator;-(int) denominator;@end
Fraction.m

#import "Fraction.h"#import 
@implementation Fraction-(Fraction*) initWithNumerator: (int) n denominator: (int) d { self = [super init]; if ( self ) { [self setNumerator: n andDenominator: d]; } return self;}-(void) print { printf( "%i/%i", numerator, denominator );}-(void) setNumerator: (int) n { numerator = n;}-(void) setDenominator: (int) d { denominator = d;}-(void) setNumerator: (int) n andDenominator: (int) d { numerator = n; denominator = d;}-(int) denominator { return denominator;}-(int) numerator { return numerator;}-(Fraction*) copyWithZone: (NSZone*) zone { return [[Fraction allocWithZone: zone] initWithNumerator: numerator denominator: denominator];}@end
Complex.h

#import 
#import "Printing.h"@interface Complex: NSObject
{ double real; double imaginary;}-(Complex*) initWithReal: (double) r andImaginary: (double) i;-(void) setReal: (double) r;-(void) setImaginary: (double) i;-(void) setReal: (double) r andImaginary: (double) i;-(double) real;-(double) imaginary;@end
Complex.m

#import "Complex.h"#import 
@implementation Complex-(Complex*) initWithReal: (double) r andImaginary: (double) i { self = [super init]; if ( self ) { [self setReal: r andImaginary: i]; } return self;}-(void) setReal: (double) r { real = r;}-(void) setImaginary: (double) i { imaginary = i;}-(void) setReal: (double) r andImaginary: (double) i { real = r; imaginary = i;}-(double) real { return real;}-(double) imaginary { return imaginary;}-(void) print { printf( "%_f + %_fi", real, imaginary );}@end
main.m

#import 
#import "Fraction.h"#import "Complex.h"int main( int argc, const char *argv[] ) { // create a new instance Fraction *frac = [[Fraction alloc] initWithNumerator: 3 denominator: 10]; Complex *comp = [[Complex alloc] initWithReal: 5 andImaginary: 15]; id
printable; id
copyPrintable; // print it printable = frac; printf( "The fraction is: " ); [printable print]; printf( "\n" ); // print complex printable = comp; printf( "The complex number is: " ); [printable print]; printf( "\n" ); // this compiles because Fraction comforms to both Printing and NSCopyable copyPrintable = frac; // this doesn't compile because Complex only conforms to Printing //copyPrintable = comp; // test conformance // true if ( [frac conformsToProtocol: @protocol( NSCopying )] == YES ) { printf( "Fraction conforms to NSCopying\n" ); } // false if ( [comp conformsToProtocol: @protocol( NSCopying )] == YES ) { printf( "Complex conforms to NSCopying\n" ); } // free memory [frac release]; [comp release]; return 0;}
output

The fraction is: 3/10The complex number is: 5.000000 + 15.000000iFraction conforms to NSCopying

转载于:https://www.cnblogs.com/sesexxoo/archive/2011/10/09/6190084.html

你可能感兴趣的文章
每周一荐:Objective-C的开源开发环境GNUstep
查看>>
10-C语言循环结构(一)
查看>>
python学习笔记--基础概要
查看>>
2018/11/28 scp eve-ng
查看>>
SQL WITH NOCHECK
查看>>
POJ3090 Visible Lattice Points
查看>>
证明积累
查看>>
Linux系统PHP 安装xdebug调试扩展
查看>>
Swiper 中文API手册(转自挨踢前端)
查看>>
数组常用api
查看>>
File i/o2
查看>>
带参有返回值方法-求1!+2!+3!+4!+5!
查看>>
How to take partial screenshot with Selenium WebDriver in python
查看>>
关于学习
查看>>
ntp配置中的tinker参数
查看>>
sql语句 in的教训
查看>>
通过setInterval函数在地图上每隔1s打一次点
查看>>
【HDOJ】4261 Estimation
查看>>
从虚拟机到redis你只需要一篇文章
查看>>
Spark学习之路 (二十三)SparkStreaming的官方文档
查看>>