这是我的代码:
#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()
答案 0 :(得分:3)
这一行进入您的班级Base
:
virtual void Sub1() = 0;
如果您没有实现Base
函数,那么将类Sub1
或任何类扩展为抽象类,这是您的类A
的情况。
您无法创建抽象类的实例,因为它具有没有实现的方法,这意味着无法调用。这种类只能通过继承来使用。
如果您想创建Base
个实例,则需要直接在A
或A
上实施。
答案 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
希望你明白我的意思。