首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++多态数据结构

C++多态数据结构
EN

Stack Overflow用户
提问于 2020-05-12 20:10:24
回答 2查看 472关注 0票数 2

经过一番探索,我还没有找到一个解决这个问题的现有问题。如果我错过了什么我很抱歉。

我有一个带有params结构和setter的基类。我想重新定义派生类中的params结构,并通过基类指针设置它。例如,类似于下面的内容。

代码语言:javascript
复制
class A
{
public:
    struct paramsType
    {
        int a;
        int b;
    };

protected:
    paramsType params;

public:
    void setParams(const paramsType& params) { this->params = params; }
};

class B : public A
{
public:
    struct paramsType
    {
        int c;
        int d;
        int e;
    };
};

class C : public A
{
public:
    struct paramsType
    {
        int f;
    };
};

int main () {
    A* ptrB = new B();
    A* ptrC = new C();

    B::paramsType paramsB;
    paramsB.c = 0;
    paramsB.d = 1;
    paramsB.e = 2;

    C::paramsType paramsC;
    paramsC.f = 3;

    ptrB->setParams(paramsB);
    ptrC->setParams(paramsC);

    delete ptrB;
    delete ptrC;
}

我尝试过使基类"setParams“是虚拟的,并在派生类中重新定义它,但是当我通过基类指针调用该方法时,它具有不兼容的类型。

在实际的用例B和C中,它们共享大量在A中实现的功能,它们只是有不同的参数集。我只能访问一个基类指针,但是我会知道对象是B还是C。有什么好的方法来解决这个问题吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-13 03:59:30

不能重新定义类型,但您可以为参数创建一个公共基类。

因此,您可以将A::paramsType作为一个基类,并从中派生B::paramsTypeC::paramsType。然后将指向A::paramsType的指针存储在A类中。这样,您就可以使用公共基类来传递参数。

但是,为了访问B::paramsTypeC::paramsType的成员,您需要降低继承层次结构。您可以在成员函数中实现这一点。如果B::paramsType是从A::paramsType派生的,那么它将能够访问A::paramsType的所有公共成员和受保护成员;同样,对于C::paramsType也是如此。

会是这样的:

代码语言:javascript
复制
class A
{
public:
    struct paramsType
    {
        virtual ~paramsType() = default;
        int a;
        int b;
    };

protected:
    std::unique_ptr<paramsType> params;

public:
    void setParams(std::unique_ptr<paramsType> params) { this->params = std::move(params); }
};

class B : public A
{
public:
    struct paramsType : A::paramsType
    {
        int c;
        int d;
        int e;
    };

private:
    B::paramsType* getParams() { return dynamic_cast<B::paramsType*>(params.get()); }
};

工作版本的这里

票数 1
EN

Stack Overflow用户

发布于 2020-05-12 20:43:20

在您的示例中,只需将A改为

代码语言:javascript
复制
class A
{
public:
    struct paramsType
    {
        int a;
        int b;
        int c;
    };

protected:
    paramsType params;

public:
    void setParams(const paramsType& params) { this->params = params; }
};

然后A可以使用paramsType::a和b,而c可以忽略paramsType::b和c。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61761048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档