在没有任何纯虚方法的情况下创建类抽象

jma*_*erx 46 c++

我有一个类是听老鼠事件.但是,我不想强​​迫用户实现任何特定的,但我想明确表示他们必须继承它.

有没有办法做到这一点?

谢谢

Phi*_*ter 57

您可以声明纯虚拟析构函数,但为其定义.该类将是抽象的,但任何继承类在默认情况下都不是抽象的.

struct Abstract
{
     virtual ~Abstract() = 0;
};

Abstract::~Abstract() {}

struct Valid: public Abstract
{
        // Notice you don't need to actually overide the base
        // classes pure virtual method as it has a default
};


int main()
{
    // Abstract        a;  // This line fails to compile as Abstract is abstract
    Valid           v;  // This compiles fine.
}
Run Code Online (Sandbox Code Playgroud)

  • 你能举个例子,我试过这个但是我的子类仍然是抽象的. (2认同)

Nim*_*Nim 44

将基础的构造函数指定为protected.这确实意味着您不能直接构造它,而是强制继承.除了良好的文档之外,没有任何东西可以让开发人员从该类继承!

例:

struct Abstract {
protected:
    Abstract() {}
};

struct Valid: public Abstract {
    // No need to override anything.
};


int main() {
    // Abstract a;  // This line fails constructor is protected
    Valid v;  // This compiles fine.
}
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案对我来说比虚拟析构函数更有意义,因为您明确限制了对构造函数的访问。我觉得这比虚拟析构函数更好地解释了自己。 (2认同)

Syl*_*sne 6

您可以将您的基类声明为实现的纯虚拟析构函数。由于析构函数始终由编译器提供,因此派生类将不是纯虚拟的,但无法直接实例化基类。无论如何,您都应该始终将析构函数声明为虚拟的,因此不会有任何开销。

class Base
{
public:
    virtual ~Base() = 0;
    virtual void SomeVirtualMethod();
};

inline Base::~Base()
{
}

class Derived : public Base
{
};

inline Base* createBase()
{
    // return new Base; // <- This won't compile
    return new Derived; // <- This does compile, Derived is not a pure virtual class !
}
Run Code Online (Sandbox Code Playgroud)