Polymorphism in C ++ and "polymorphism" in objective-C"

Source: Internet
Author: User

Polymorphism in C ++ (two types ):

Compile-time matching: function overload. Different function call matching is implemented based on the name, type, and number of member functions;

Runtime matching: virtual functions, specifically by declaring the member function as virtual when the parent class or abstract class is declared, and then the subclass inherits and implements the function, by assigning the subclass object address to the pointer of its parent class (note: the abstract class cannot be instantiated, that is, the object cannot be defined, but the pointer and reference to the class can be defined ), call the virtual function pointed to by the parent class pointer after the assignment to call different sub-classes for different implementations of the virtual function.

In C ++, virtual is used for Polymorphism when running.

Use Protocol to implement "polymorphism" in Obiective-C. For details, see the following example (the example is from 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


Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

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.