我有一个user class
,它具有指向data class
的成员指针。但是我想实现一个扩展了derivedUser
的user
,但它还需要具有存储在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的构造函数如下所示,则可以确保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);
};
}