我收到错误:无法将变量“a”声明为抽象类型“A”

Jac*_*son 1 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);
}
Run Code Online (Sandbox Code Playgroud)

我在最后遇到了麻烦,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()
Run Code Online (Sandbox Code Playgroud)

Ara*_*hor 5

这条线进入你的班级Base

virtual void Sub1() = 0;
Run Code Online (Sandbox Code Playgroud)

Base如果您不实现该功能Sub1,则将该类或任何扩展它的类设为抽象类,这就是您的类的情况A

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

所以你需要直接实现它,Base或者A如果你想创建A实例。