禁止在c++的派生类中使用默认构造函数

Forbid using default constructor in derived classes, C++

本文关键字:默认 构造函数 c++ 派生 禁止      更新时间:2023-10-16

是否有任何方法可以创建基类(例如boost::noncopyable)并继承它,这将禁止编译器为派生类生成默认构造函数,如果它不是由用户(开发人员)创建的?

的例子:

class SuperDad {
XXX:
  SuperDad(); // = delete?
};
class Child : YYY SuperDad {
public:
  Child(int a) {...}
};

和结果:

int main () {
  Child a;     // compile error
  Child b[7];  // compile error
  Child c(13); // OK
}

将构造函数设为私有。

protected:
    Base() = default;
#include <iostream>
using namespace std;

class InterfaceA
{
public:
InterfaceA(std::string message)
{
    std::cout << "Message from InterfaceA: " << message << std::endl;
}
private:
    InterfaceA() = delete;
};

class MyClass: InterfaceA
{
public:
    MyClass(std::string msg) : InterfaceA(msg)
    {
        std::cout << "Message from MyClass: " << msg << std::endl;
    }
};
int main()
{
    MyClass c("Hello Stack Overflow");
    return 0;
}

根据cppreference.com的这篇文章(基本上是c++标准12.1的律师到人的翻译)。部分):

如果没有为类提供任何类型的用户定义构造函数类型(结构、类或联合),编译器将总是声明一个默认构造函数作为其类的内联公共成员。

SuperDad控制Child的隐式定义构造函数的唯一方法是使编译器将其定义为deleted

您可以通过将SuperDad的默认构造函数(或析构函数)删除,模糊或不可访问来做到这一点-但是您必须定义一些其他方法来创建基类并从所有子构造函数中隐式地使用它。