C++ 在c+中声明抽象类+;

C++ 在c+中声明抽象类+;,c++,abstract,C++,Abstract,如何声明抽象类 例如,我知道它使用了关键字virtual like: class test{ public: virtual void test()=0; } 我的问题是我能像这样抽象测试类吗?如果不是,为什么和如何 virtual class test{ } 我的问题是我能像这样抽象测试类吗 不,你不能。抽象类定义为至少包含一个纯虚函数的类。您的代码: class test { virtual void test()=0; } 创建一个抽象类。 它包含一个或多个纯虚拟函数: virtua

如何声明抽象类

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

class test{
public:
virtual void test()=0;
}
我的问题是我能像这样抽象测试类吗?如果不是,为什么和如何

virtual class test{
}
我的问题是我能像这样抽象测试类吗

不,你不能。抽象类定义为至少包含一个纯虚函数的类。

您的代码:

class test
{
virtual void test()=0;
}
创建一个抽象类。
它包含一个或多个纯虚拟函数:

virtual void test()=0;//is a pure virtual function/method
抽象类是包含一个或多个纯虚函数的类定义

不能创建抽象类的实例,因为它不是完整的定义

您的代码:

 virtual class test
{
    }
是无意义的,因为它不包含一个或多个纯虚函数,所以不能定义为抽象类,并且是对“virtual”关键字的不当使用

您可能会被“虚拟基类”的说法所迷惑,这是一种对“抽象类”语义的误导

创建抽象类的目的是将其继承到派生类中,并为纯虚函数提供完整的定义

抽象类可以包含许多完全定义的方法,但只有一个纯虚方法会使它变得抽象。这个简单化的例子具有误导性。抽象类很常见,通常是(Barbara)Liskov替换原则引起的问题的“修复”


D.T.< /P> < P>大多数情况下,抽象类包含抽象(“C++中纯名词”)方法:

这足以使其成为一个抽象类:

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;
};

你为什么要这么做?拥有一个没有方法的类是完全没有意义的。我想确认一下,如果我能像上面所说的那样声明一个抽象类,这是不可能的,你不应该想这样做。这毫无意义。
class Foo {
public:
    virtual ~Foo() = default;
    virtual void bar() { }

protected:
    Foo() = default;
};