2012-04-26 3 views
2

MSFT компиляторов для поддержки явного переопределения C++ (см http://msdn.microsoft.com/en-us/library/ksek8777.aspx)Явных главенствующие

// could be declared __interface I1, making the public scope and pure virtual implied 
// I use the more expressive form here for clarity 
class I1 
{ 
public: 
    virtual void foo() = 0; 
}; 

class I2 
{ 
public: 
    virtual void foo() = 0; 
}; 

class C : public I1, public I2 
{ 
public: 
    virtual void I1::foo() { cout << "I1::foo\n"; } 
    virtual void I2::foo() { cout << "I2::foo\n"; } 
}; 

int main() 
{ 
    C c; 
    static_cast<I1*>(&c)->foo(); 
    static_cast<I2*>(&c)->foo(); 

    cin.get(); 
} 

Но НКА не нравятся. Простой «явный переопределения» онлайн-поиска дает информацию о новом ключевом слове override. Это не обязательно связано с тем, что я ищу. Поддерживается ли эта функция каким-либо другим способом в C++ 11 (для каждой спецификации) или, по крайней мере, каким-то образом в gcc?

Примечание: приемлемым ответом может быть взлом - если он находится в том же духе вопроса, а не новый дизайн для решения другой проблемы.

ответ

3

Я считаю, что единственный путь через промежуточные классы, которые реализуют функциональные возможности:

class Impl1 : public I1 { 
public: 
    void foo() { cout << "I1::foo\n"; } 
}; 

class Impl2 : public I2 { 
public: 
    void foo() { cout << "I2::foo\n"; } 
}; 

class C : public Impl1, public Impl2 
{ 
}; 

Предоставленный, это делает его гораздо сложнее, как только эти функции должны получить доступ пользователей из C - они не могут, члены должны быть пропущены в запутанном порядке.

Кстати, нет необходимости в указателях; Вы можете использовать ссылки:

int main() 
{ 
    C c; 
    static_cast<I1&>(c).foo(); 
    static_cast<I2&>(c).foo(); 
} 

(Или использовать явную квалификацию, которая позволяет обойтись без виртуальной отправки вообще :)

c.Impl1::foo(); 
c.Impl2::foo(); 
+0

, что является приемлемым, отличная идея. Неловко, когда простая идея используется для решения проблемы, я думаю, что иногда мы получаем свои головы в определенном мышлении и ожидаем найти конкретный «тип» ответа. Также +1 для ref cast vs pointer; У меня на самом деле были указатели в реальном коде - быстрое исправление в образце кода после copy + paste. Тем не менее, хорошо отметить, что у нас есть этот вариант. (к сожалению, я не могу дважды выставлять вас на защиту). – payo

+2

@payo, Позвольте мне сделать это за вас :) – chris

+0

@chris +1 для вас мой друг :) хе-хе – payo

Смежные вопросы