我想创建一个接口-一个抽象类,它强制其他派生类(即符合该接口)以提供特定的构造函数。
大致情况:
class IComClient
{
public:
virtual IComClient(int _id, TBaseCom*_com) = 0;
virtual void task() = 0;
private:
int id;
TBaseCom* com;
);
很显然,这是行不通的-正如我read一样,类不能具有纯虚拟构造函数-or通常是虚拟构造函数。我不在乎以多态方式创建派生类的实例,我只是希望编译器抗议如果派生类没有提供采用这些特定输入参数的构造函数。
C#有一个答案,但是C ++中的情况是否相同?
答案 0 :(得分:1)
没有办法强制基类中派生类存在特定的构造函数。
您可以通过尝试调用特定构造函数或使用static_assert
来强制特定构造函数的存在。
如果将来的标准中将they接受到该语言中,则不是通过基类而是使用元类可以实现类似的目的。
答案 1 :(得分:0)
存在接口,以便旧代码可以调用新代码。您编写一个提供功能的接口,例如foo()
。即使尚无foo()
的实现,我也可以编写调用foo()
now 的代码。在我退休到巴哈马的别墅很久之后,它将可以调用foo()
的任何将来的实现。
如果您宣布该类的所有将来子代都将实现默认构造函数,则此信息对我无用。我无法构造尚未编写的类的实例!我或未曾见过您班级后裔的其他人该如何处理您的公告?
如果有一个用户A想创建您的类的后代,而有一个用户B想实例化类的后代,那么让他们自己决定如何做到最好。您不是他们交易中的当事方。
但是等等,我可以有点儿尚未构造的类的构造实例!我需要编写一个模板,在其中构造一个对象,然后有人将使用其类实例化它。但是然后我只能使用默认的构造函数,而这种用法会强制任何想要实例化我的模板的人实现默认的构造函数。
当然,您不能强迫任何人实例化您的模板。如果用户需要,他们将实现您所需的构造函数。如果他们不需要您的服务,最好不要告诉他们该怎么做。