C++11 纯虚拟析构函数足以使类抽象吗?

C++11 纯虚拟析构函数足以使类抽象吗?,c++11,interface,abstract-class,C++11,Interface,Abstract Class,我希望这不会成为一个“复制品”,因为有太多关于(纯)虚拟破坏结构的问题(是的,我知道) 我想用一堆方法构建一个“接口”(>抽象类),这些方法可以重新实现,但不需要。所以我喜欢: class IBase { public: virtual bool doThis() { return true; } virtual bool doThat() { return true; } } 我给出了一些实现,一些使用doThis一些使用doThat。这就是为什么“接口”方法只是虚拟的而不是纯粹的。

我希望这不会成为一个“复制品”,因为有太多关于(纯)虚拟破坏结构的问题(是的,我知道)

我想用一堆方法构建一个“接口”(>抽象类),这些方法可以重新实现,但不需要。所以我喜欢:

class IBase
{
public:
  virtual bool doThis() { return true; }
  virtual bool doThat() { return true; }
}
我给出了一些实现,一些使用
doThis
一些使用
doThat
。这就是为什么“接口”方法只是虚拟的而不是纯粹的。比如:

class Derived1 : public IBase
{
public:
  bool doThis() override { return doSomething(); }
}

class Derived2 : public IBase
{
public:
  bool doThat() override { return doSomethingElse(); }
}
问题:这个
IBase
类是可实例化的,它不能实例化,因为它不做任何事情

我的问题:定义一个纯虚拟析构函数
virtual~IBase()=0
使其不可实例化是否足够? 和/或我是否需要删除标准构造函数
IBase()=delete

也许我最终因为思考太久而变成了代码盲,所以我会事先找个借口


编辑:我最初的问候被我打断了,所以我现在就向你们打招呼,或者永远不打招呼:嘿,伙计们

是的,使析构函数纯足以使类抽象。抽象类定义为“至少有一个纯虚成员函数”

但是,请注意,您仍然需要为纯虚拟析构函数提供一个实现,否则派生类将无法调用它。您可以这样做:

class IBase
{
public:
  virtual ~IBase() = 0;
  virtual bool doThis() { return true; }
  virtual bool doThat() { return true; }
}

inline IBase::~IBase() {}
定义一个纯虚拟析构函数
virtual~IBase()=0
使其不可实例化就足够了吗

对。必须注意的是,纯虚析构函数与非特殊纯虚函数的定义不同:对于析构函数,必须有一个定义。因此,你必须补充

IBase::~IBase() {}
某处。关于这个话题的好读物是

和/或我是否需要删除标准构造函数
IBase()=delete


不。

我个人会避免让析构函数成为纯粹的虚拟函数。 在C++中,可以定义一个函数,该函数已声明为虚拟函数。请参见以下示例:

class IBase
{
public:
IBase() = default;
virtual ~IBase() = default;

virtual bool doThis() = 0;

virtual bool doThat() = 0;
};

bool IBase::doThis()
{
    return true;
}

bool IBase::doThat()
{
    return true;
}

class Derived2 : public IBase
{
public:
bool doThat() override { return false; }

bool doThis() override { return IBase::doThis(); } // call parent implementation
};

int main()
{
    Derived2 a;
    std::cout << a.doThat() << std::endl;
    std::cout << a.doThis() << std::endl;
}
class-IBase
{
公众:
IBase()=默认值;
virtual~IBase()=默认值;
虚拟布尔点this()=0;
虚拟布尔doThat()=0;
};
bool IBase::doThis()
{
返回true;
}
bool IBase::doThat()
{
返回true;
}
派生类2:公共IBase
{
公众:
bool doThat()重写{return false;}
bool doThis()重写{return IBase::doThis();}//调用父实现
};
int main()
{
衍生的2 a;
这是一个完全任意的要求。因为它什么都不做。从某种意义上说,数字零、空集、标识函数都“什么都不做”,但我们仍然保留它们。