【问题标题】:Can a base class implement an explicit interface?基类可以实现显式接口吗?
【发布时间】:2018-02-08 14:58:01
【问题描述】:

一个 sn-p 可以说一千多个单词。有没有办法使以下工作,如果没有,为什么?

#include <iostream>
#include <string>

class ISquealer
{
public:
    virtual void squeale() = 0;
};

class DefaultSqueel : public ISquealer // May be others
{
public:
    virtual void squeale() override
    {
        std::cout << "Squeeaale!!";
    }
};

class IAnimal : public ISquealer
{
public:
    virtual std::string getName() = 0;
};

class Pig : public IAnimal, public DefaultSqueel
{
public:
    virtual std::string getName() { return "Piggy"; }
};


int main()
{
    Pig pig; // object of abstract type 'Pig' is not allowed
}

编辑:

只是为了澄清问题所在:这不会编译,因为编译器认为 Pig 是抽象的,因此即使 squeale 方法实际上是在 Pig 继承层次结构中实现的,也无法实例化。

【问题讨论】:

  • 你没有说它工作时应该做什么。
  • 你想达到什么目的? sn-p 坏了,所以当你不说它应该做什么时,没有办法“让它工作”
  • 对不起,我添加了一个编辑来澄清。错误是当我假设抽象方法将由 DefaultSqueel 基类实现时,'Pig' 是抽象的。我想知道为什么会这样以及如何解决它。
  • 是否故意将squeale()DefaultSqueel 中设为私有?
  • @tobi303 不,这是一个错误。不过好像没什么区别。

标签: c++ visual-c++ visual-studio-2015 multiple-inheritance


【解决方案1】:

IAnimal 不会覆盖虚拟的squeale 函数。

因此,即使Pig 继承自DefaultSqueel,编译器也不满意它所继承的IAnimal 部分仍然不是虚拟的。

如果Pig 覆盖了squeale 函数,那么它会编译:

class Pig : public IAnimal, public DefaultSqueel
{
    virtual std::string getName() { return "Piggy"; }
    virtual void squeale() override
    {
        DefaultSqueel::squeale() ; //to avoid reimplementing
    }
};

如果你看一下继承图,那么很明显从ISquealer 继承两次没有任何好处:

如果只有一个继承自 ISquealer,那么代码也会编译:

#include <iostream>
#include <string>

class ISquealer
{
public:
    virtual void squeale() = 0;
};

class DefaultSqueel : public ISquealer // May be others
{
    virtual void squeale() override
    {
        std::cout << "Squeeaale!!";
    }
};

class IAnimal 
{
    virtual std::string getName() = 0;
};

class Pig : public IAnimal, public DefaultSqueel
{
    virtual std::string getName() { return "Piggy"; }
};


int main()
{
    Pig pig; // object of abstract type 'Pig' is not allowed
}

【讨论】:

  • 嗯,是的,但是我会在 Pig 中实现 ISqueale,这是我想要避免的。
  • 从 ISqueale 移除 IAnimal 的继承 - 它是具有不同功能集的不同接口...或从 Pig::squeale() 调用 DefaultSqueel::squeale()
猜你喜欢
  • 2014-03-26
  • 2011-06-15
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多