在继承类中扩展struct

时间:2016-08-07 14:03:27

标签: c++ inheritance directx

是否可以在父类中声明一个结构并在继承子类中定义它(在每个子类中它应该看起来不同)?

示例如下:

class parent
{
    virtual struct AlwaysDifferentStructure;

    //Some methods here
    //...
};

class child1 : public parent
{
    struct AlwaysDifferentStructure
    {
        int foo;
    }

    //Some methods here
    //...
};

class child2 : public parent
{
    struct AlwaysDifferentStructure
    {
        char* foo;
        float bar;
        double foobar;
    }

    //Some methods here
    //...
};

所以实际上我正在尝试处理的是以下内容: 我有一个父类shader和许多继承类(即simple_color_shader)。每个着色器都有自己的顶点结构。现在我想使用其中一个着色器渲染一个对象,但我不知道顶点结构是如何完全看起来的,因为它总是不同但我需要它。所以我认为我可以重新声明所有孩子中的结构并通过父母获得访问权限。所以在object类中它基本上是这样的:

class object
{
    parent* m_pParent;
    AlwaysDifferentStructure* m_structArray;
};

(只是问你是否理解我要告诉你的事情;我的英语不是那么好)

我的问题是:这是否可能,如果是的话我会很感激,如果有人能告诉我如何。

2 个答案:

答案 0 :(得分:0)

这样的事情可以通过Curiously recurring template pattern

来完成
template <typename derived>
class parent
{
    void someMethod ()
    {
        typename derived::AlwaysDifferentStructure x;

        x.foo;
    }
};

class child1 : public parent <child1>
{
    struct AlwaysDifferentStructure
    {
        int foo;
    }

    //Some methods here
    //...
}

class child2 : public parent <child2>
{
    struct AlwaysDifferentStructure
    {
        char* foo;
        float bar;
        double foobar;
    }

    //Some methods here
    //...
}

答案 1 :(得分:0)

对于OP发现评论中发布的片段是很好的建议,我在这里张贴给未来的读者。

这是一种可能的方法,如评论中所述:

class parent { };
class child1 : public parent { };
class child2 : public parent { };

template<typename>
struct AlwaysDifferentStructure;

template<>
struct AlwaysDifferentStructure<child1> {
    int foo;
};

template<>
struct AlwaysDifferentStructure<child2> {
    char* foo;
    float bar;
    double foobar;
};

int main() {
    AlwaysDifferentStructure<child1> c1t;
    c1t.foo = 42;
    AlwaysDifferentStructure<child2> c2t;
    c2t.foo = new char{'c'};
    c2t.bar = .42;
    c2t.foobar = 0.;
}

作为另一种可行的解决方案,您可以这样做:

class parent {
    //Some methods here
    //...
};

class child1 : public parent {
public:
    auto alwaysDifferentStructure() {
        struct S {
            int foo;
        } s;

        return s;
    }
};

class child2 : public parent {
public:
    auto alwaysDifferentStructure() {
        struct S { 
            char* foo;
            float bar;
            double foobar;
        } s;

        return s;
    }
};

int main() {
    auto c1t = child1{}.alwaysDifferentStructure();
    c1t.foo = 42;
    auto c2t = child2{}.alwaysDifferentStructure();
    c2t.foo = new char{'c'};
    c2t.bar = .42;
    c2t.foobar = 0.;
}

请注意,第二个示例需要C ++ 14。