禁止在派生 类 中使用默认构造函数,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 并使用它隐含地来自所有子构造函数。
有什么方法可以创建基础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 并使用它隐含地来自所有子构造函数。