从基类继承两次时如何解决“错误:没有匹配的函数可供调用”

时间:2019-05-17 10:51:44

标签: 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);
}

尝试编译时收到以下错误消息:

“错误:没有匹配的函数可以调用'Base :: Base()'”

任何想法,我在做什么错了?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

虚拟继承和虚拟函数是不同的概念。

虚拟继承的特殊之处在于 虚拟基需要由所有派生类显式初始化。 在这种情况下,// Make $array1 associative. $array1 = array_column($array1, null, "id"); // Find all true values in $array1 from $array2 $result = array_intersect_key($array1, array_intersect(array_combine(array_keys($array2), array_column($array2, "status")), [true])); 尝试将Derived2的初始化委托给Base, 但这是无效的。 Derived1的构造函数实际上所做的是 调用Derived2的默认构造函数 因为省略了用于初始化Base mem-initializer

您应该显式调用Base的构造函数:

Base

当然,如果class Derived2 :public Derived1 { public: Derived2(int &id) : Base(id), Derived1(id) { }; }; 并非虚拟地源自Derived1, 那么Base的派生类可以仅依靠Derived1的构造函数 初始化Derived1。 因此,另一种解决方案取决于您的情况, 就是简单地删除 base-specifier 中的Base

virtual

答案 1 :(得分:2)

虚拟继承是一种奇怪的野兽。它要求最派生的类初始化虚拟基类。在您的情况下,该初始化丢失。应该这样做:

 public function sendcampaign(Request $request)
    {
        $this->validate($request,[
        'subject'=>'required',
        'to_email'=>'required',
        'from_email'=>'required',
        'message'=>'required'
                ]);

          try {


                    $options = [
                    'list_id'   => env('MAILCHIMP_AUDIENCE_ID'),
                    'subject' => $request->input('subject'),
                    'from_name' => $request->input('from_email'),
                    'from_email' => 'ad01santosh@gmail.com',
                    'to_name' => $request->input('to_email')
                    ];


                    $content = [
                    'html' => $request->input('message'),
                    'text' => strip_tags($request->input('message'))
                    ];


                    $campaign = Newsletter::create('regular', $options, $content);
                    Newsletter::send($campaign['id']);


                    return redirect()->back()->with('success','send campaign successfully');


                } catch (Exception $e) {
                    return redirect()->back()->with('error','Error from MailChimp');
                }
}