C++中的多態和Objective-C中的“多態”

來源:互聯網
上載者:User

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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.