从C ++中的任意类继承?

时间:2019-07-03 13:28:32

标签: c++

是否可以设计一个将从一组基类中的任何一个继承的类?我希望能够编写如下内容:

class Derived : public ArbitraryBase {
    public:
        Derived () : ArbitraryBase () {}

    ...
};

其中ArbitraryBase可以是在编译​​时确定的一些基类。我有一组基类,我想从中派生相同的类。有没有一种方法可以避免为每个基类编写一个单独的派生类?

2 个答案:

答案 0 :(得分:9)

如果是在编译时真正确定的,则可以将派生类作为模板:

template<class T>
class Derived : public T {
    public:
        Derived() {}

    ...
};

您可以稍后通过提供基本类型来创建实例化此类:

int main() {
    Derived< ??? > my_object;

    ...
}

???是获取派生类型的一些编译时方式。

答案 1 :(得分:5)

您可以通过模板执行此操作。使用

template<typename T>
class Derived : public T
{
public:
    Derived() : T() {}
    // or just use if actually need to provide a default constructor
    Derived() = default;
};

为您提供一个从T继承并调用T的默认构造函数的类。您将使用它来创建一个具体的类

Derived<Base1> d;

现在d是从Derived继承的Base1

如果您需要继承任意数量的碱基,则可以使用可变参数模板,例如

template<typename... Bases>
class Derived : public Bases...
{
public:
    Dervied() : Bases()... {}
    // or just use if actually need to provide a default constructor
    Derived() = default;
};

它会像

那样使用
Derived<Base1, Base2, ..., BaseN> d;