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 回答