【问题标题】:c++ Derived class changing a base class pointerc ++派生类更改基类指针
【发布时间】:2017-12-30 23:56:58
【问题描述】:

我有一个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);
}

【问题讨论】:

  • 难道没有初始化那些类的private/protected字段的构造函数吗?那么,为什么不能创建一个只接受适当类型的 Data 实例的构造函数,并将其用于字段的初始化?
  • 为什么要指向派生类?使用虚函数,并且尽可能只指向基础。

标签: c++ pointers inheritance dynamic-cast


【解决方案1】:

我看到您希望 DerivedUser 在其构造函数中包含 DerivedData。

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

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) {

    }
};

现在,DerivedUser 指向您的 DerivedData 类

这里:

int main(){

    DerivedData* dp = new DerivedData();

    DerivedUser* user = new DerivedUser(dp);


    return 0;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      相关资源
      最近更新 更多