target-c ++: возможно ли определить класс c ++ с помощью метода, который возвращает классы target-c и использует ковариантные возвраты? - PullRequest
1 голос
/ 06 июля 2011

** Редактировать: это происходит только с llvm; GCC поддерживает это просто отлично.

Рассмотрим следующее.

Objective-C классы A и B.

B является подклассом A.

Мы хотим, чтобы C ++ Hiearchy был похож на:

class X {
  //...
  public:
    virtual A* getFoo();
};
class Y : public X {
  //...
  public:
    B* getFoo();
};

Однако, если вы сделаете это, вы получите ошибку, так как типы Objective-c путают компилятор c ++:

error: virtual function 'getFoo' has a different return type ('Y *') than the function it overrides (which has return type 'X *')

Мне интересно, есть ли у кого-нибудь обходной путь для этого? (Очевидно, что в долгосрочной перспективе мы будем уходить от классов Objective-c, но это не сегодня).

P.S. Этот кажется самым похожим вопросом, который я мог найти, но я уверен, что это другая проблема.

1 Ответ

0 голосов
/ 08 июля 2011

Это компилируется и работает нормально для меня:

#import <Cocoa/Cocoa.h>

@interface A : NSObject

- (NSString*) bar;

@end

@implementation A

- (NSString*) bar
{
    return @"";
}

@end

@interface B : A
@end

@implementation B

- (NSString*) bar
{
    return @"!!!";
}

@end

class X {
  //...
  public:
    virtual A* getFoo() = 0;
};

class Y : public X {
  //...
  public:
    virtual B* getFoo() { return [B new]; }
};


int main (int argc, char const *argv[])
{
    X* x = new Y;
    NSLog(@"%@", [x->getFoo() bar]);  // >> !!!

    return 0;
}

Может быть, ваша проблема заключалась в том, что вы не импортировали заголовочный файл B в файл, определяющий Y?Вы не можете получить ковариацию (по крайней мере в c ++) для неполных классов, поскольку компилятор должен знать, что B наследует от A для компиляции Y.

В любом случае, чтобы ответить на ваш вопрос, похоже, этоможно сделать это.

...