C++中的多態(兩種):
編譯時間匹配:函數重載,依據成員函數的名字、形參類型、形參個數等不同來實現不同的函數調用匹配;
運行時匹配:虛函數,具體就是通過將父類或抽象類別聲明時成員函式宣告為virtual,然後子類繼承並實現,應用時,通過將子類對象地址賦給其父類類型的指標(注,抽象類別不能執行個體化,即不能定義對象,但是可以定義指向該類類型的指標和引用),通過調用賦值後的父類指標指向的虛函數來達到調用不同子類對該虛函數的不同實現的目的。
C++中實現運行時多態使用virtual.
Obiective-C中實現“多態”使用protocol. 具體請看如下執行個體,(執行個體摘自《Objective-C Beginner's Guide》)
Printing.h
@protocol Printing-(void) print;@end
Fraction.h
#import <Foundation/NSObject.h>#import "Printing.h"@interface Fraction: NSObject <Printing, NSCopying> { 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 <stdio.h>@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 <Foundation/NSObject.h>#import "Printing.h"@interface Complex: NSObject <Printing> { 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 <stdio.h>@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 <stdio.h>#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 <Printing> printable; id <NSCopying, Printing> 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