nil*_*ert 5 c++ inheritance initializer-list
我目前正在尝试在我的项目中实现多种继承类。因此,我正在使用成员初始化器列表,并将“变量”一直引用到基类。我真的不确定,为什么会出现编译器错误。
我已经尝试将引用“ int&id”更改为指针“ int * id”。上面的示例只是指出我的问题的一个最小示例:
class Base
{
public:
int& m_id;
Base(int &id)
: m_id(id)
{
}
};
class Derived1: virtual public Base
{
public:
Derived1(int &id) : Base(id)
{
};
};
class Derived2: public Derived1
{
public:
Derived2(int &id) : Derived1(id)
{
};
};
int main()
{
int i = 13;
Derived2 Test(i);
}
Run Code Online (Sandbox Code Playgroud)
尝试编译时出现以下错误消息:
“错误:没有匹配的函数可以调用'Base :: Base()'”
任何想法,我在做什么错?
谢谢你的帮助。
虚拟继承和虚拟函数是不同的概念。
虚拟继承的特殊之处在于,虚拟基类需要由所有派生类显式初始化。在本例中,Derived2尝试将初始化委托给Baseto Derived1,但这无效。的构造函数Derived2实际上所做的是调用默认构造函数,Base
因为省略了初始化Base.
您应该显式调用构造函数Base:
class Derived2 :public Derived1 {
public:
Derived2(int &id) : Base(id), Derived1(id)
{
};
};
Run Code Online (Sandbox Code Playgroud)
当然,如果Derived1不是虚拟派生Base,那么Derived1派生类可以只依赖Derived1构造函数来初始化Base。因此,根据您的情况,另一个修复方法是简单地删除base-specifiervirtual中的:
class Derived1 :public Base {
public:
Derived1(int &id) :Base(id)
{
};
};
class Derived2: public Derived1 {
public:
Derived2(int &id) :Derived1(id)
{
};
};
Run Code Online (Sandbox Code Playgroud)