2012-06-26 6 views
3
class IA 
{ 
public: 
    virtual void a() = 0; 
}; 

class A: public IA 
{ 
public: 
    virtual void a() 
    { 
    } 
}; 

class IB 
{ 
public: 
    virtual void b() = 0; 
}; 

class B: public IB, public A 
{ 
public: 
    virtual void b() 
    { 
    } 
}; 

void f(IA* p) 
{ 

} 

int main() 
{ 
    B b = B(); 
    IB* p = &b; 
    f(p); 
} 

Это правильный способ реализации интерфейсов с наследованием в C++? Если да, то как мне получить строку f(p); в моем коде для компиляции? В принципе, я хотел бы, если IB мог унаследовать от IA, но это может вызвать проблемы для B.Расширение интерфейсов с использованием наследования

UPDATE

То, что я хочу, чтобы IB включить интерфейс IA «s, следующим образом. Однако этот код не будет компилироваться, поскольку IA::a() и A::a() конфликтуют друг с другом. Что мне делать?

class IA 
{ 
public: 
    virtual void a() = 0; 
}; 

class A: public IA 
{ 
public: 
    virtual void a() 
    { 
    } 
}; 

class IB : public IA 
{ 
public: 
    virtual void b() = 0; 
}; 

class B: public IB, public A 
{ 
public: 
    virtual void b() 
    { 
    } 
}; 

UPDATE 2

компилируется, это выглядит правильно? Мне нужны все эти виртуалы ли

class IA 
{ 
public: 
    virtual void a() = 0; 
}; 

class A: virtual public IA 
{ 
public: 
    virtual void a() 
    { 
    } 
}; 

class IB: virtual public IA 
{ 
public: 
    virtual void b() = 0; 
}; 

class B: virtual public IB, public A 
{ 
public: 
    virtual void b() 
    { 
    } 
}; 
+1

'' IB' и IA' являются никоим образом не связаны с каждым other.It не трудно понять, что вы пытаетесь сделать с прохождением '' IB *, где функция ожидает ' IA * ' –

+0

Почему вы не передаете' & b' прямо в 'f'? – unkulunkulu

ответ

5

Ну, это правильный путь, конечно, но линия f(p) не должен составлять как есть, представьте себе классы, которые реализуют IB, но не реализует IA, это возможно, так вы не можете предположить, что все они реализуют IA. Если вы хотите предположить, что вы можете наследовать IB от IA, но это другой дизайн. Она может быть реализована следующим образом:

class IA 
{ 
public: 
    virtual void a() = 0; 
}; 

class A: virtual public IA 
{ 
public: 
    virtual void a() 
    { 
    } 
}; 

class IB : virtual public IA 
{ 
public: 
    virtual void b() = 0; 
}; 

class B: public IB, public A 
{ 
public: 
    virtual void b() 
    { 
    } 
}; 
+0

Я могу наследовать IB-форму IA - это именно тот дизайн, который я хочу. Но что Б должен наследовать, если он должен реализовать интерфейс IB и получить реализацию А? – Baz

+0

@Baz, не виртуальное наследование от 'IA' help? – unkulunkulu

+0

Да! Виртуальное наследование - это то, что я ищу. Является ли хорошей практикой всегда наследовать интерфейсы как виртуальные? – Baz