不能引用类继承默认构造函数

Class Inheritance default constructor cannot be referenced

本文关键字:默认 构造函数 继承 引用 不能      更新时间:2023-10-16

问题:33978185,32569833对我没有帮助。

顺便说一句,有问题33978185此错误被认为是一个错误,但由于我使用的是VS2017,我认为现在应该修复它。

问题40181845是使用结构,我不太了解它......
问题38469597说我应该做B类-朋友类,这里也是这样吗?

我试图寻找更多的解决方案,但我没有得到我需要的东西。

承认我对面向对象 c++ 的编程知识水平:高级>普通>乞求。
我是正常的。

我有 A 类和 B 类:

class A
{
protected:
int q;
int w;
public:
A(int);
functionE();
functionR();
};
class B:public A
{
public:
functionT();
};

main当我想创建一个类B的对象时,我得到错误:

默认构造函数"ObjectName"不能被引用 - 它是一个已删除的函数。

根据我对面向对象编程的了解,当某些成员受到保护时,它们可以被继承的类访问,如果继承是公共的,它可以访问公共函数。

我希望我的 B 班有奖励functionT(),没有别的,但正如我所说,能够访问受保护的班级成员。

一种解决方案是在类A中实际编写functionT()代码,这消除了对类B的需求,但我不希望这样。

我该怎么办?

当你尝试创建一个class B的对象时,你得到一个错误,因为你没有声明任何构造函数。B不能有默认构造函数,因为A也没有默认构造函数(当您将A(int)声明为构造函数时A您隐式删除了默认构造函数(。

可以为 A 创建默认构造函数,也可以通过A() = default

或者为 B 创建一个构造函数,如下所示

B() : A(0) {}
B(int i) : A(i) {}

通过提供构造函数A(int)默认构造函数A()被删除。但是,在创建类B的实例时,它必须调用其超类的构造函数A。您提供的唯一方法是调用默认构造函数,该构造函数不再存在,因此您的代码无法编译。

为了编译它,你需要告诉B它应该如何构造A。例如,您可以将此构造函数添加到BB(int a) : A(a) {}

由于您有一个用于类A的自定义构造函数,因此需要由类B的构造函数调用它。 生成的类B的 "空" 构造函数试图调用类A的 "空" 构造函数,该构造函数不再可用。所以你也需要为B编写一个构造函数。

class B : public A
{
public:
B() : A(0) {}
/* or  */
B(int v) : A(v) {}
};