我得到错误:无法将变量'a'声明为抽象类型'A'

时间:2016-04-28 05:30:11

标签: c++ inheritance abstract-class

这是我的代码:

#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无法使用,但最后,它说的是,&#34;错误:无法声明变量'a'是抽象类型'A'&#34;任何帮助将不胜感激,谢谢。

---如果有帮助,输出没有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()

4 个答案:

答案 0 :(得分:3)

这一行进入您的班级Base

virtual void Sub1() = 0;

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

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

如果您想创建Base个实例,则需要直接在AA上实施。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

    virtual void Sub1() = 0;

您从class A派生的Base也是抽象的,因为它不提供该方法的重写实现。

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

答案 3 :(得分:0)

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

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

希望你明白我的意思。