为什么不能用'using'指令实现继承的纯虚方法?

时间:2012-10-15 12:41:31

标签: c++ interface using-directives

  

可能重复:
  Why does C++ not let baseclasses implement a derived class' inherited interface?

#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中还有其他方法吗?

1 个答案:

答案 0 :(得分: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是同一个。我不完全确定标准对此有何看法!