我有一个user class,它具有指向data class的成员指针。但是我想实现一个扩展了derivedUseruser,但它还需要具有存储在derivedData class中的其他数据,看起来像这样:

class Data {
    /*...the stored data...*/
}

class DerivedData : public Data {
    /*...the additional data...*/
}

class User {

    public:
        /*...some methods that use dp...*/

    protected:
         Data* dp;
}


class DerivedUser : public User {

    public:
        /*...even more methods that use ddp...*/

    protected:
         DerivedData* ddp;
}

但这是问题所在:用我设置的方式,DerivedUser class将存储指向同一对象的两个不同类型的指针,这不是最佳的。 DerivedUser应该只存储一个指针,并且应该知道它是DerivedData类型,如果给定了错误的数据类型,它就会失败。问题是:我该如何实现?

我试过了:
class DerivedUser : public User {

    public:
        /*...even more methods that use ddp...*/

    protected:
        DerivedData* ddp = dynamic_cast<DerivedData*>(dp);
}

最佳答案

在DerivedUser类中添加方法DerivedData* GetData()DerivedData* GetData(){ return static_cast<DerivedData>(dp);}
如果DerivedUser的构造函数如下所示,则可以确保dpDerivedData*:
DerivedUser(DerivedData* d):User(d){}
这是完整的代码:

class Data {
    /*...the stored data...*/
}

class DerivedData : public Data {
    /*...the additional data...*/
}

class User {

    public:
        User(Data* d):dp(d){}
        /*...some methods that use dp...*/

    protected:
        Data* dp;
}

class DerivedUser : public User {

    public:
        DerivedUser(DerivedData* d):User(d){}
        /*...even more methods that use ddp...*/

    protected:
        DerivedData* GetData(void)
        {
            return static_cast<DerivedData*>(dp);
        };
}

07-28 06:40