c++ 派生类更改基类指针

c++ Derived class changing a base class pointer

本文关键字:基类 指针 派生 c++      更新时间:2023-10-16

我有一个user class,它有一个指向data class的成员指针。但是我想实现一个扩展userderivedUser,但它还需要有存储在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);
}

我看到您希望衍生用户在其构造函数中包含衍生数据。

由于多态性,父类可以引用它子类。所以这是合法的:

Data* dp = new DerivedData();

这是您正在寻找的解决方案:

class User {
public:
    /*...some methods that use dp...*/
    User(Data* dp){
        this->dp = dp;
    }
protected:
    Data* dp;
};
class DerivedUser : public User {
public:
    /*...even more methods that use ddp...*/
    DerivedUser(DerivedData *dp) : User(dp) {
    }
};

现在,派生用户指向你的派生数据类

这里:

int main(){
    DerivedData* dp = new DerivedData();
    DerivedUser* user = new DerivedUser(dp);

    return 0;
}

在派生用户类中添加方法DerivedData* GetData()

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

如果 DerivedUser 的构造函数如下所示,则可以确保dp是一个DerivedData*

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