【问题标题】:I get the error: cannot declare variable ‘a’ to be of abstract type ‘A’我收到错误:无法将变量“a”声明为抽象类型“A”
【发布时间】:2016-08-22 16:56:22
【问题描述】:

这是我的代码:

#include <iostream>

using namespace std;

class Base
{
    public:
        virtual void Sub1() = 0;
        virtual void Sub2();
        virtual void Sub3();
        void Sub4();
};

class A : public Base
{
    public:
        void Sub2();
        void Sub4();
};

class B : public A
{
    public:
        virtual void Sub1();
        void Sub2();
};

class C : public Base
{
    public:
        virtual void Sub1();
        virtual void Sub4();
};

void Base::Sub2()
{
    cout << "Hello from Base::Sub2()" << endl;
}

void Base::Sub3()
{
    cout << "Hello from Base::Sub3()" << endl;
    Sub1(); // DONT MISS THIS CALL IN YOUR ANSWER
}

void Base::Sub4()
{
    cout << "Hello from Base::Sub4()" << endl;
}

void A::Sub2()
{
    cout << "Hello from A:Sub2()" << endl;
}
void A::Sub4()
{
    cout << "Hello from A:Sub4()" << endl;
}

void B::Sub1()
{
    cout << "Hello from B:Sub1()" << endl;
}
void B::Sub2()
{
    cout << "Hello from B:Sub2()" << endl;
}

void C::Sub1()
{
    cout << "Hello from C:Sub1()" << endl;
}
void C::Sub4()
{
    cout << "Hello from C:Sub4()" << endl; //error used to say from Sub2
}

void Sub(Base& x)
{
    x.Sub1();
    x.Sub2();
    x.Sub3();
}
void AnotherSub(A& a)
{
    a.Sub1();
    a.Sub2();
    a.Sub4();
}

int main()
{
    A a; // wont compile
    B b;
    C c;
    Sub(a);
    Sub(b);
    Sub(c);
    AnotherSub(b);
}

我在使用 A a; 时遇到了问题,很明显是结尾 Sub(a);,因为 a 不能使用,但在最后,它说,“错误:不能将变量 'a' 声明为抽象类型'A'" 任何帮助将不胜感激,谢谢。

--- 如果有帮助,输出没有 A a;工作原理和外观如下:

    Hello from B:Sub1()
    Hello from B:Sub2()
    Hello from Base::Sub3()
    Hello from B:Sub1()
    Hello from C:Sub1()
    Hello from Base::Sub2()
    Hello from Base::Sub3()
    Hello from C:Sub1()
    Hello from B:Sub1()
    Hello from B:Sub2()
    Hello from A:Sub4()

【问题讨论】:

标签: c++ inheritance abstract-class


【解决方案1】:

这一行进入你的班级Base

virtual void Sub1() = 0;

如果您没有实现函数Sub1,则将类Base 或任何扩展它的类设为抽象类,您的类A 就是这种情况。

你不能创建抽象类的实例,因为它有没有实现的方法,这意味着不可能调用。这种类只能通过继承来使用。

所以如果要创建A 实例,则需要直接在BaseA 上实现。

【讨论】:

    【解决方案2】:

    您的编译器是正确的:您不能创建抽象类型的变量。你的class Base 是抽象的,因为它声明了一个纯虚方法,即一个没有任何实现的函数:

        virtual void Sub1() = 0;
    

    Base 派生的class A 也是抽象的,因为它没有为该方法提供覆盖实现。

    您必须为所有声明的虚拟方法提供一个实现,以使类型可实例化。当您在class B 中覆盖纯虚拟Sub1() 时,您可以创建B 类(及其后代类)的变量,但class A 本身不能用作变量的实际类型。

    【讨论】:

      【解决方案3】:

      您正在从A 扩展基类,但您没有在A 中实现纯虚方法。因此,您需要将A 设为抽象类。它不能是一个具体的类。

      要忽略将 A 设为抽象并将其用作具体类,只需 override 也使用纯虚方法并在其中不使用任何语句定义它。现在您可以为A 创建一个实例。

      【讨论】:

        【解决方案4】:

        我要补充的是,由于 Base 是抽象的,而 A 类没有实现其纯虚函数之一,所以 A 也是抽象的。由于抽象类不能被实例化(只允许指针和引用),我们使用抽象类的指针(比如指向 A 的指针)来实例化从抽象类(在这种情况下为 A 或基类)派生的类的对象。 所以你需要提供纯虚函数的实现,并且必须使用指向 A 的指针

        A *a;
        a = new B(); // it would compile now
        

        希望你明白我的意思。

        【讨论】:

          猜你喜欢
          • 2021-08-21
          • 2012-07-23
          • 1970-01-01
          • 1970-01-01
          • 2016-07-04
          • 2021-12-07
          • 2013-03-09
          • 2013-11-15
          • 1970-01-01
          相关资源
          最近更新 更多