在c ++中声明抽象类

时间:2017-04-19 17:34:02

标签: c++ abstract

我如何声明抽象类?

例如,我知道它使用关键字virtual like:

class test{
public:
virtual void test()=0;
}

我的问题是我可以像这样抽象测试类吗?如果不是为什么以及如何

virtual class test{
}

3 个答案:

答案 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