【发布时间】:2015-12-23 08:24:45
【问题描述】:
是否可以在不为每个实现实现的情况下继承接口的实现?
上图中IBase和Ichild是只有纯虚方法的类,Base实现了IBase的方法,Child实现了IChild的方法。
现在Child 是否有可能通过Base 继承IBase 的方法的实现,从而Child 不必自己实现这些方法?
我尝试这样实现它:
struct IBase {
virtual void do_something_Base() = 0;
};
struct IChild : public virtual IBase {
virtual void do_something_Child() = 0;
};
struct Base : public virtual IBase {
virtual void do_something_Base() { //implementation IBase method
//do sth
}
};
struct Child : public Base , public IChild {
virtual void do_something_Child() { //implementation IChild method
//do sth
}
};
int main() {
IBase* B = new Child;
B->do_something_Base();
delete B;
return 0;
}
这段代码的问题在于编译器给出了警告:
警告 C4250:'Child':通过支配继承 'Base::Base::do_something_Base'
此外,程序在delete B 行崩溃。
(如果我使用IChild* B 而不是IBase* B 程序不会崩溃。为什么会这样?)
提前致谢
【问题讨论】:
-
是的,我知道虚拟继承,但编译器会发出警告。警告说
IBase的方法是由支配继承的。 -
如果您遇到代码错误,请edit 使用minimal reproducible example 或SSCCE (Short, Self Contained, Correct Example) 提出您的问题
-
对于崩溃:
warning: deleting object of abstract class type 'IBase' which has non-virtual destructor will cause undefined behaviour [-Wdelete-non-virtual-dtor] -
我在你的多态类中看不到虚拟析构函数。我相信,它应该是编译器错误!
标签: c++ oop inheritance interface