我如何声明抽象类?
例如,我知道它使用关键字virtual like:
class test{
public:
virtual void test()=0;
}
我的问题是我可以像这样抽象测试类吗?如果不是为什么以及如何
virtual class test{
}
答案 0 :(得分:4)
我的问题是我可以像这样抽象测试类吗?
不,你不能。根据定义,抽象类是一个包含至少一个纯虚函数的类。
答案 1 :(得分:1)
在大多数情况下,您的抽象类包含abstract(用C ++术语表示为“纯虚拟”)方法:
class Foo {
public:
virtual ~Foo() = default;
virtual void bar() = 0;
};
这足以使其成为抽象类:
Foo foo; // gcc says: cannot declare variable 'foo' to be of abstract type 'Foo'
请注意,您确实要在基类中将析构函数声明为虚拟的,否则当通过基类指针销毁派生对象时,您将面临未定义行为的风险。
在某些情况下,您可能没有没有抽象方法,但仍然希望将您的类标记为抽象。有两种方法:
a。将您的基本析构函数声明为纯虚拟的:
class Foo {
public:
virtual ~Foo() = 0;
virtual void bar() { }
};
Foo::~Foo() = default; // need to define or linker error occurs
b。将所有基本构造函数声明为受保护的:
class Foo {
public:
virtual ~Foo() = default;
virtual void bar() { }
protected:
Foo() = default;
};
答案 2 :(得分:0)
您的代码:
class test
{
virtual void test()=0;
}
创建一个抽象类 它包含一个或多个纯虚函数:
virtual void test()=0;//is a pure virtual function/method
抽象类是包含一个或多个纯虚函数的类定义。
您无法创建抽象类的实例,因为它不是完整的定义。
您的代码:
virtual class test
{
}
是荒谬的,不会升级为抽象类的定义,因为它不包含一个或多个纯虚函数,并且是对'virtual'关键字的错误使用......
你可能会因为谈论“虚拟基类”而感到困惑,这是一种误导性的方式来引用“抽象类”的语义。
创建抽象类的目的是将其继承到派生类中,并为纯虚函数提供完整定义。
抽象类可以包含许多完全定义的方法,但只有一个纯虚方法可以使它抽象化。这个简单的例子具有误导性。抽象类是常见的,并且通常是(芭芭拉)Liskov替换原则引起的问题的“修复”。
Dr t