How to fix "error: no matching function for call to" when inheriting twice from a base class
How to fix "error: no matching function for call to" when inheriting twice from a base class
我目前正在尝试在我的项目中实现继承的 classes 的层次结构。因此,我使用成员初始化列表和 "pipe" 对变量的引用,一直到基数 class。我真的不确定,为什么我会收到编译器错误。
我已经尝试将引用 "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);
}
我在尝试编译时收到以下错误消息:
"error: no matching function for call to ‘Base::Base()’"
知道吗,我做错了什么?
感谢您的帮助。
虚继承和虚函数是不同的概念。
虚拟继承的特殊之处在于
虚拟基需要由所有派生 类 显式初始化。
在这种情况下,Derived2
尝试将 Base
的初始化委托给 Derived1
,
但这是无效的。
Derived2
的构造函数实际上做的是
调用 Base
的默认构造函数
因为省略了初始化 Base
.
的 mem-initializer
您应该显式调用 Base
的构造函数:
class Derived2 :public Derived1 {
public:
Derived2(int &id) : Base(id), Derived1(id)
{
};
};
当然,如果 Derived1
不是从 Base
虚拟派生的,
那么 Derived1
的派生 类 可以只依赖 Derived1
的构造函数
初始化 Base
。
所以另一个修复,取决于你的情况,
就是简单地删除 base-specifier:
中的 virtual
class Derived1 :public Base {
public:
Derived1(int &id) :Base(id)
{
};
};
class Derived2: public Derived1 {
public:
Derived2(int &id) :Derived1(id)
{
};
};
虚拟继承是一头奇怪的野兽。它要求 most-derived class 初始化虚拟基 classes。在您的情况下,缺少该初始化。应该这样做:
class Derived2: public Derived1
{
public:
Derived2(int &id) : Base(id), Derived1(id)
{
}
};
我目前正在尝试在我的项目中实现继承的 classes 的层次结构。因此,我使用成员初始化列表和 "pipe" 对变量的引用,一直到基数 class。我真的不确定,为什么我会收到编译器错误。
我已经尝试将引用 "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);
}
我在尝试编译时收到以下错误消息:
"error: no matching function for call to ‘Base::Base()’"
知道吗,我做错了什么?
感谢您的帮助。
虚继承和虚函数是不同的概念。
虚拟继承的特殊之处在于
虚拟基需要由所有派生 类 显式初始化。
在这种情况下,Derived2
尝试将 Base
的初始化委托给 Derived1
,
但这是无效的。
Derived2
的构造函数实际上做的是
调用 Base
的默认构造函数
因为省略了初始化 Base
.
您应该显式调用 Base
的构造函数:
class Derived2 :public Derived1 {
public:
Derived2(int &id) : Base(id), Derived1(id)
{
};
};
当然,如果 Derived1
不是从 Base
虚拟派生的,
那么 Derived1
的派生 类 可以只依赖 Derived1
的构造函数
初始化 Base
。
所以另一个修复,取决于你的情况,
就是简单地删除 base-specifier:
virtual
class Derived1 :public Base {
public:
Derived1(int &id) :Base(id)
{
};
};
class Derived2: public Derived1 {
public:
Derived2(int &id) :Derived1(id)
{
};
};
虚拟继承是一头奇怪的野兽。它要求 most-derived class 初始化虚拟基 classes。在您的情况下,缺少该初始化。应该这样做:
class Derived2: public Derived1
{
public:
Derived2(int &id) : Base(id), Derived1(id)
{
}
};