abc接口继承和基类中的重新暴露方法

时间:2011-03-16 07:42:36

标签: c++ inheritance

我很好奇是否有一种巧妙的方法来公开派生接口的基类中的方法。

所以在代码中: -

class cbase {
public:
  void MyMethodA() { }
};

class cderived : public cbase {
public:
  void MyMethodB() { }
}

class ibase { 
public:
  virtual void MyMethodA() = 0;
};
class iderived : public ibase {
public:
  virtual void MyMethodB() = 0;
};

现在如果我让cbase继承ibase,并且cderived工具被认为是,编译器会抱怨当我实例化cderived时,MyMethodA()是抽象的而不是实现的。

MyMethodA()在基类和ibase中实现。解决这个问题的唯一方法是在cderived类中重新实现ibase的方法吗?如果是这样,那就好了!

如下所示: -

class cbase : public ibase {
public:
  void MyMethodA() { }
};

class cderived : public cbase, public iderived {
public:
  void MyMethodA() { cbase::MyMethodA(); }
  void MyMethodB() { }
};

cderived inst;
iderived *der = &inst;  
der->MyMethodA();
der->MyMethodB();
ibase *bas = der;
bas->MyMethodA();

我希望这足以传达这个问题。 :)当我们尝试重构旧代码时,它可能听起来有点循环。

我相信那里有很多热切的评论;)

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望ibase成为iderivedcbase的虚拟基类。

这是类层次结构中每个接口类只有一个实例,当您在cbase级别加入iderivedcderived时,非虚拟覆盖使用MyMethodA中的cbase,因为它是支配覆盖。

见这里:Hidden Features of C++?

E.g。

class ibase { 
public:
  virtual void MyMethodA() = 0;
};
class iderived : public virtual ibase {
public:
  virtual void MyMethodB() = 0;
};

class cbase : public virtual ibase {
public:
  void MyMethodA() { }
};

class cderived : public cbase, public virtual iderived {
public:
  void MyMethodB() { }
};

int main()
{
    cderived inst;
    iderived *der = &inst;  
    der->MyMethodA();
    der->MyMethodB();
    ibase *bas = der;
    bas->MyMethodA();
}

答案 1 :(得分:0)

查看multiple inheritance

该常见问题项目的答案基本上是回答您的问题:

class cderived : public virtual cbase {
public:
  void MyMethodB() { }
}

class ibase { 
public:
  virtual void MyMethodA() = 0;
};
class iderived : public virtual ibase {
public:
  virtual void MyMethodB() = 0;
};