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

时间:2018-08-10 11:52:08

标签: c++

问题: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的对象时,出现错误:

  

默认的构造函数“对象名”不能被引用-它是一个已删除的函数。

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

我希望我的B类有奖金functionT(),但别无其他,但是正如我所说,我可以访问受保护的类成员。

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

我该怎么办?

3 个答案:

答案 0 :(得分:3)

当您尝试创建B的对象时,由于未声明任何构造函数而收到错误消息。 A不能具有默认构造函数,因为A(int)也没有默认构造函数(当您将A声明为A() = default构造函数时,会隐式删除默认构造函数)。

您可以为A创建默认的构造函数,或者通过B() : A(0) {} B(int i) : A(i) {}

为其默认设置

或为B创建一个构造函数,

Observable

答案 1 :(得分:0)

由于您具有类B的自定义构造函数,因此需要由类B的构造函数调用。 生成的类A的“空”构造函数尝试调用类B的“空”之一,该类不再可用。因此,您还需要为class B : public A { public: B() : A(0) {} /* or */ B(int v) : A(v) {} }; 写一个构造函数。

class B

答案 2 :(得分:0)

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

要使其编译,您需要告诉A应该如何构造B。例如,您可以将此构造函数添加到B(int a) : A(a) {}setTimeout(() => { var colorThief = new ColorThief(); var imgObj = new Image(); var count = 0; for (i = 0; i < assetsArray1.length; i++) { if (i % 2 == 0) { // get currency symbol /*var curr_sign = "$"; curr_sign = formatter.format(totalvalue1).replace(/[0-9]/g, '').replace(",", "").replace(".", "").replace(" ", "");*/ allocation_chart.data.labels[i / 2] = assetsArray1[i]; imgObj.src = 'icon/' + assetsArray1[i].toLowerCase() + '.png'; imgObj.onload = function () { count += colorThief.getColor(imgObj)[0]; console.log(count); }; } else { allocation_chart.data.datasets[0].data[i / 2 - 0.5] = price1_[i / 2 - 0.5].toFixed(2); } } allocation_chart.update(); }, 100);