c ++派生类更改基类指针
Posted
技术标签:
【中文标题】c ++派生类更改基类指针【英文标题】:c++ Derived class changing a base class pointer 【发布时间】:2017-12-30 23:56:58 【问题描述】:我有一个user class
,它有一个指向data class
的成员指针。但是我想实现一个扩展user
的derivedUser
,但它还需要存储在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 的构造函数如下所示,您可以确保 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);
;
【讨论】:
以上是关于c ++派生类更改基类指针的主要内容,如果未能解决你的问题,请参考以下文章