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に問題が発生します。

アップデート

私が欲しいのは、次のようにのインターフェースIBを含めることです。IAただし、このコードはそれ以降コンパイルされ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()
    {
    }
};

更新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()
    {
    }
};
4

1 に答える 1

6

もちろん、これは正しい方法ですが、行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()
    {
    }
};
于 2012-06-26T09:36:27.270 に答える