在继承类中扩展结构

Extend struct in inheriting class

本文关键字:扩展 结构 继承      更新时间:2023-10-16

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

一个例子如下:

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;
};

(问问你是否不明白我想告诉你的话;我的英语不太好(

我的问题是:这可能吗?如果可能的话,如果有人能告诉我怎么做,我将不胜感激。

类似的事情可以用奇怪的重复模板模式来完成

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
    //...
}

由于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。