我可以强制定义具有接口 class 的特定构造函数吗?

Can I enforce defining a specific constructor with an interface class?

我想创建一个接口 - 一个抽象 class,其中强制派生的 classes(即符合接口)提供特定的构造函数。

大致情况:

class IComClient
{
public:
    virtual IComClient(int _id, TBaseCom*_com) = 0;
    virtual void task() = 0;
private:
    int id;
    TBaseCom* com;
);

显然,这行不通 - 因为我 read, a class can't have a pure virtual constructor - or 通常是一个虚拟构造函数。我不关心以多态方式创建派生 classes 的实例,我只是希望编译器在派生 class 不提供采用这些特定输入参数的构造函数时提出抗议。

C# 有答案,但 C++ 中的情况是否相同?

无法为基 class 中的派生 classes 强制存在特定的构造函数 class。

您可以通过尝试调用该构造函数或使用 static_assert.

来强制特定构造函数的存在

类似的东西可能不是通过基础 class 实现的,而是使用元 class... 如果 they 在未来的标准中被接受到语言中。

存在接口以便旧代码可以调用新代码。您编写了一个提供函数的接口,比如 foo()。我可以编写调用 foo() now 的代码,即使尚未实现 foo()。它将能够调用 foo() 的任何未来实现,这些实现是在我退休到我在巴哈马群岛的别墅很久之后写的。

如果您宣称您 class 的所有未来后代都将实现默认构造函数,那么此信息对我来说毫无用处。我无法构建尚未编写的 class 的实例!我或其他没有见过您的 class 后代的人应该如何处理您的公告?

如果有用户 A 想要创建您的 class 的后代,而用户 B 想要实例化 A 的 class,那么让他们自己决定如何做到最好。你不是他们交易的一方。

但是等一下,我 可以 有点构造尚未编写的 class 的实例!我需要写一个模板,在里面构造一个对象,有人会用他们的 class 实例化它。但是这样我就可以使用默认构造函数,这种使用会强制任何想要实例化我的模板的人实现默认构造函数。

当然你不能强迫任何人实例化你的模板。如果用户需要,他们将实现您需要的构造函数。如果他们不需要你的服务,你最好不要告诉他们该怎么做。