受保护的继承错误
protected inheritance error
#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;
}
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 在 c++ 中拆分类和标头中的继承,错误
- enable_if继承的成员函数的名称查找错误
- C++模板类 - 继承调用错误的函数
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 为什么这个混合继承程序给出错误的输出?
- 使用多重继承时出现编译错误
- 多级继承错误 C2280:"atttempting to reference a deleted function"
- 相对于继承的构造函数,gcc 编译器是否还有一个错误?
- 从模板继承的 MSVC DLL 导出类会导致LNK2005已定义的错误
- 模板化类继承的子类定义中的错误
- C++错误LNK2005和不同项目文件的常规继承
- 错误:'int_type'未命名类型 - 如何继承 typedefs 和用法
- 在 soap_ssl_server_context(..) 中使用继承时 gsoap 中的分段错误
- C++中的继承,"...is an ambiguous base of ..."错误
- 与lambda一起使用虚拟继承在初始化列表中捕获此问题的GCC错误
- 收到未定义的引用错误 c++ 继承/多态性
- c++错误:继承转换无效
- 错误继承不能访问c++的方法