【发布时间】:2016-03-04 19:11:12
【问题描述】:
class Base
{
public:
Base(std::string arg1, std::string arg2) : arg1(arg1), arg2(arg2) {}
string arg1,arg2;
virtual void f() = 0;
inline virtual ~Base() {}
};
class Mixin1 : virtual public Base
{
};
//Virtual class uses virtual base and a mixin
class VirtualDerived : virtual public Base, public Mixin1
{
public:
VirtualDerived(string arg2) : Base("some literal", arg2) {}
};
//Here I am concretely subclassing VirtualDerived, whose constructor constructs all virtual superclasses.
class ConcreteDerived : public VirtualDerived
{
public:
ConcreteDerived(string arg2) : VirtualDerived(arg2) {}
inline void f() {}
};
int main(int argc, const char * argv[]) {
ConcreteDerived cd("hello");
return 0;
}
我是从 VirtualDerived 派生的,它的构造函数将初始化 Base。我是否明确声明 VirtualDerived 对 Mixin1 virtual 的继承没有区别。
我得到的错误是 ConcreteDerived 必须显式调用 Base 的构造函数。
使 ConcreteDerived 的继承虚拟化同样没有区别。
问题不在于 VirutalDerived 的构造函数转发。如果我实现 f 使其成为一个具体的类,我可以毫无问题地创建它:
class VirtualDerived : virtual public Base, public Mixin1
{
public:
VirtualDerived(string arg2) : Base("some literal", arg2) {}
inline void f(){}
};
int main(int argc, const char * argv[]) {
VirtualDerived cd("hello");
return 0;
}
编译器似乎明白,VirtualDerived 的构造函数在直接创建 VirtualDerived 时调用 Base 的 non-trivial 构造函数。但如果某些东西派生 VirtualDerived 并调用它,则不会。为什么会这样?
【问题讨论】:
-
"
virtual public Base, public Mixin1"这里为什么继承Base?
标签: c++ inheritance constructor initialization virtual-inheritance