C++ 基类中的abc接口继承和重新公开方法

C++ 基类中的abc接口继承和重新公开方法,c++,inheritance,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

我很好奇,在派生接口的基类中是否有一种简洁的方法公开方法

因此,在代码中:-

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实现iderived,编译器会抱怨当我实例化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();
我希望这足以表达这个问题当我们试图重构旧代码时,这听起来可能有点荒谬


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

如果我理解正确,您希望使
ibase
成为
iderived
cbase
的虚拟基类

在类层次结构中,每个接口类只有一个实例,当您在
cderived
级别将
cbase
iderived
连接在一起时,会使用
cbase
中的
MyMethodA
的非虚拟覆盖,因为它是主要覆盖

请看这里:

例如

看一看

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

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;
};

iderived和cbase实际上不需要从它们的基类继承,不是吗?@VJo:对不起,我不明白你的问题。哇,所以我忽略了visual-c中的支配警告,而这一切都是假的?我印象深刻:)换句话说:为什么这样:
class-iderived:public-virtual-ibase
?为什么不干脆
class-iderived:public-ibase
?@VJo:
ibase
实际上是一个接口类。如果在类层次结构的两个点上都不是虚拟基类,那么基类将有两个副本,并且需要在继承树的两个分支中重写
MyMethodA
。如果
ibase
不是
iderived
的虚拟基类,那么
cbase
MyMethodA
的实现就不会是对
ibase
副本的覆盖,后者是
iderived
的非虚拟基类。我认为问题的关键是找到一种避免实现的方法
MyMethodA
的“直通”版本。
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;
};