受保护的继承错误

protected inheritance error

本文关键字:错误 继承 受保护      更新时间:2023-10-16
#include<iostream>
using namespace std;
class base 
{
protected:
    int a;
public:
    base(int i)
    {
        a=i;
    }
};
class derived :protected base
{
public:
    derived(){}
    void show()
    {
        cout<<a;
    }
};
int main()
{
    base obj(2);
    derived obj1;
    obj1.show();
    return 0;
}

为什么这个程序给出错误,如在构造函数derived::derived()

错误:调用base::base()没有匹配函数

请解释一下。正如我在stackoverflow中读到的那样,在继承为受保护的情况下,基类的受保护成员成为派生类的受保护成员。如果我错了,请分享一个好的链接来消除我的误解

为任何类定义构造函数后,编译器不会为该类生成默认构造函数。

您为base定义了参数化构造函数(base(int i)(,因此编译器不会为 base 生成无参数构造函数。

分辨率:
您将需要定义一个不带参数的构造函数,而无需自己base
将此添加到您的base类中:

base():a(0)
{
}

编辑:

是否需要为每个类定义默认构造函数?还是有必要在基类型中也存在与派生类型匹配的构造函数?

这两个问题的答案是否定的

C++ 中构造函数的目的是初始化构造函数中类的成员变量。如您所知,编译器为每个类生成默认构造函数(不带参数的构造函数(。

但是有一个问题,如果你自己为你的类定义了(任何(构造函数(一个有参数或不带参数(,编译器不会再为此生成默认构造函数。这里的编译器推理是"呵呵,这个用户自己为他的类写了一个构造器,所以他可能需要在构造函数中做一些我无法做或理解的特殊事情">,有了这个推理,编译器只是不再生成默认的无参数构造函数。

上面的代码和你假设默认的无参数构造函数的存在(当创建derived类对象时(。但是,由于您已经为 base 类定义了一个构造函数,编译器已应用其推理,现在它拒绝为您的 base 类生成任何默认参数构造函数。因此,base类中缺少 no 参数构造函数会导致编译器错误。

必须为基构造函数指定一个值:

class Derived : protected base
{
public:
     Derived() : base(0)
     {
     }
};

根据您的实现,将值提供给base构造函数。但是,您可能希望 Derived 构造函数也将int作为参数,然后将其传递给base参数。

您需要

base中实现一个空的构造函数,或者从 c-tor 显式调用定义的base(int)构造函数derived。没有它,当derived c'tor 被激活时,它试图调用base()[空c'tor],但它不存在,你得到你的错误。

你还没有为 Base 定义默认构造函数。

当你实例化一个 Derived 的实例时,它将调用 Derived() 构造函数,而构造函数又会尝试调用Base()默认构造函数,该构造函数不存在,因为您尚未定义它。

您可以为基Base::Base()声明一个空构造函数,也可以调用现有构造函数,如下所示:

#include<iostream>
using namespace std;
class base 
{
protected:
    int a;
public:
    base(int i)
    {
        a=i;
    }
};
class derived :protected base
{
    derived(): Base(123) {}  --this will call the Base(int i) constructor)
    void show()
    {
        cout<<a;
    }
};
int main()
{
    base obj(2);
    derived obj1;
    obj1.show();
    return 0;
}