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

Forbid using default constructor in derived classes, C++

有什么方法可以创建基础class(例如boost::noncopyable)并继承它,这将禁止编译器为派生生成默认构造函数class是的,如果不是用户(开发者)制作的?

示例:

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

根据this cppreference.com article(这基本上是 C++ 标准 12.1. 部分的律师到人类的翻译):

If no user-defined constructors of any kind are provided for a class type (struct, class, or union), the compiler will always declare a default constructor as an inline public member of its class.

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

您可以通过使 SuperDad 的默认构造函数(或析构函数)删除、模棱两可或不可访问来做到这一点 - 但是您必须定义一些其他方式来创建基础 class 并使用它隐含地来自所有子构造函数。