2

重複の可能性:
C ++でベースクラスに派生クラスの継承されたインターフェイスを実装させないのはなぜですか?

#include <iostream>

class Interface
{
public:
    virtual void yell(void) = 0;
};

class Implementation
{
public:
    void yell(void)
    {
        std::cout << "hello world!" << std::endl;
    }
};

class Test: private Implementation, public Interface
{
public:
    using Implementation::yell;
};

int main (void)
{
    Test t;
    t.yell();
}

Testクラスをの観点から実装したいのImplementationですが、

void Test::yell(void) { Implementation::yell(); }

方法。なぜこのようにすることができないのですか?C ++ 03に他の方法はありますか?

4

1 に答える 1

2

usingスコープに名前を入れるだけです。

何も実装していません。

Javaのようなget-implementation-by-inheritanceが必要な場合は、次のように、それに関連するオーバーヘッド、つまりvirtual継承を明示的に追加する必要があります。

#include <iostream>

class Interface
{
public:
    virtual void yell() = 0;
};

class Implementation
    : public virtual Interface
{
public:
    void yell()
    {
        std::cout << "hello world!" << std::endl;
    }
};

class Test: private Implementation, public virtual Interface
{
public:
    using Implementation::yell;
};

int main ()
{
    Test t;
    t.yell();
}


編集:この機能は少し卑劣です。コードをg++でコンパイルするために編集する必要がありました。yellこれは、実装とインターフェースyellが同一であることを自動的に認識しませんでした。規格がそれについて何を言っているのか完全にはわかりません!

于 2012-10-15T12:45:29.053 に答える