我很好奇是否有一种巧妙的方法来公开派生接口的基类中的方法。
所以在代码中: -
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();
我希望这足以传达这个问题。 :)当我们尝试重构旧代码时,它可能听起来有点循环。
我相信那里有很多热切的评论;)
答案 0 :(得分:2)
如果我理解正确,您希望ibase
成为iderived
和cbase
的虚拟基类。
这是类层次结构中每个接口类只有一个实例,当您在cbase
级别加入iderived
和cderived
时,非虚拟覆盖使用MyMethodA
中的cbase
,因为它是支配覆盖。
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)
该常见问题项目的答案基本上是回答您的问题:
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;
};