C++ 不考虑输入参数的继承

C++ 不考虑输入参数的继承,c++,class,inheritance,arguments,virtual-functions,C++,Class,Inheritance,Arguments,Virtual Functions,我想创建接口类,然后从中继承派生类。 不幸的是,可以有多种类型的派生类-名称相同但输入参数不同的方法 下面是继承类的类图 是否可以创建InterfaceClass,而不考虑类型和计数!输入参数 我想实现的是——有多个最终的子项SpecificWorker1..n,每个子项都必须实现名为buildRequest的方法,但它们都有自己的一组输入参数 谢谢。不,buildrequest的所有不同重载都是单独的方法,而不是SpecificWorker3。所有类都是抽象的,因为它们不实现没有参数的版本

我想创建接口类,然后从中继承派生类。 不幸的是,可以有多种类型的派生类-名称相同但输入参数不同的方法

下面是继承类的类图

是否可以创建InterfaceClass,而不考虑类型和计数!输入参数

我想实现的是——有多个最终的子项SpecificWorker1..n,每个子项都必须实现名为buildRequest的方法,但它们都有自己的一组输入参数


谢谢。

不,buildrequest的所有不同重载都是单独的方法,而不是SpecificWorker3。所有类都是抽象的,因为它们不实现没有参数的版本


你到底想达到什么目的?当您的接口不接受任何参数时,您如何将参数传递给重载?

您不能按您想要的方式进行传递。您可以创建结构的继承层次结构,其中层次结构中的每个子级都封装了不同类型的参数。然而,这将完全违背首先拥有接口和继承的目的,因为原始接口的每个实现都必须能够处理所有类型的输入


老实说,你的设计有些可疑,你不应该这么做。你想达到什么目的?

我不知道你为什么要这样做。但您可以使用可变模板尝试此解决方案。我只是想回答这个问题:

是否可以创建InterfaceClass,而不考虑类型和类型 计数输入参数

输出:


你试过了吗?尝试不会比问这个问题花费太多时间,编译器会回答你是的。。当我声明void buildRequeststd::list inputList时,它不起作用,因为SpecificWorker1没有覆盖InterfaceClass中的buildRequest。我只想让SpecificWorker 1..n有尽可能多的不同子级,但每个子级都必须实现名为buildRequest的方法,但是,如果这些buildRequest方法没有相同的签名,您打算如何通过接口调用它们呢?记住,虚拟函数的意义在于在不知道实际实现的情况下调用它们。如果我知道如何轻松实现,我就不会提出这个问题。@zdenpoavlik我的意思是你不能。您需要重新评估您的设计。也许将参数传递给SpecificWorker类的构造函数并存储它们?然后他们都可以用相同的无参数签名实现buildRequest。@MilesBudnek幸运的是,这还没有设计,只是正在设计中。我们正在考虑这个问题。是的,通过构造函数传递参数是可能的。也可以创建一些DTO结构,只传输其中的所有数据。但我们两个都不喜欢。我原以为这种方法行不通,但在得出最终结论之前,我想从这里的人们那里找到不同的意见……是的,我们发现可变模板是最好的解决方案。。尽管不容易看出它在起作用D也许我们会这样做。
template <typename Head, typename ...Tail>
class InterfaceClass
{
private:
    static void buildRequest() {};

public:
    virtual ~InterfaceClass() = default;
    virtual void buildRequest(Head h, Tail  ...t) = 0;
};

template <typename Head, typename ...Tail>
class DefaultWorker : public InterfaceClass <Head, Tail...>
{
public:

    virtual void buildRequest(Head h, Tail  ...t) = 0;

};

class SpecificWorker1 : public DefaultWorker <std::list<int>, int>
{
public:

    void buildRequest(std::list<int> h, int g = 0) override
    {
        std::cout << "Hello from SpecificWorker1. list size: " << h.size() << std::endl;
    }

};

class SpecificWorker2 : public DefaultWorker <int, float>
{
public:
    void buildRequest(int h, float f) override
    {
        std::cout << "Hello from SpecificWorker2. " << h << " " << f << std::endl;
    }
};

class SpecificWorker3 : public DefaultWorker <int, float, std::string>
{
public:
    void buildRequest(int h, float f, std::string comment) override
    {
        std::cout << "Hello from SpecificWorker3. int: " << h << " float:  " << f << " comment: " << comment << std::endl;
    }
};

int main()
{
    SpecificWorker2 e;
    e.buildRequest(1, 1.1);

    std::list<int> list{ 1, 2, 3 };
    SpecificWorker1 c;
    c.buildRequest(list);

    SpecificWorker3 d;
    d.buildRequest(1, 1.1, "this is a comment");

    system("pause");

}