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

Posted

技术标签:

【中文标题】c ++派生类更改基类指针【英文标题】:c++ Derived class changing a base class pointer 【发布时间】: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 实例的构造函数,并将其用于字段的初始化? 为什么要指向派生类?使用虚函数,并且尽可能只指向基础。 【参考方案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);
        ;

【讨论】:

以上是关于c ++派生类更改基类指针的主要内容,如果未能解决你的问题,请参考以下文章

C ++ - 在运行时从基类指针识别派生类

c ++:将指针传递给基类时访问派生类方法?

派生类和基类之间的指针到指针的转换?

虚函数和基类中的this指针的问题!

知道基类指针指向哪个派生类

C ++:将void *转换为基类指针时访问冲突