更改派生对象中的基础对象

Posted

技术标签:

【中文标题】更改派生对象中的基础对象【英文标题】:Change base object in derived object 【发布时间】:2017-04-29 14:31:46 【问题描述】:

在我的一个类GUI 中,我有一个类User u 的私有变量。在这个GUI 类中,我有一个功能供用户登录,然后检查他们的帐户是管理员还是普通用户,然后从中创建UserAdmin 对象。管理员派生自具有更多权限的用户。我如何在他们登录后将私有变量User u 设置为Admin 对象或User 对象。

【问题讨论】:

阅读您最喜欢的 C++ 书籍中的多态性。 【参考方案1】:

如果Admin 类扩展了User 类,那么您可以使用User u 来表示它们。

当您只需要管理员并且您不知道 uAdmin 还是 User 对象时,您可以在运行时像这样检查它:

if(Admin * v = dynamic_cast<Admin*>(u)) 
   // u was safely casted to Admin
   v->doSomething();
  

注意 dynamic_cast 是一项成本很高的操作,您可以阅读 here 一些解决方法。

【讨论】:

我没有投票,但提议的解决方案不会导致代码具有良好/干净的架构。当然,管理员“是”用户,但给不同的用户不同的“角色”可能会更好。 @DanielJour 我不是在评判架构。我正在回答问题的要求。在问题中写着 Admin 来自用户

以上是关于更改派生对象中的基础对象的主要内容,如果未能解决你的问题,请参考以下文章

C ++如何使用派生对象中的独立基础对象

更改派生类对象的字段,但返回后更改已恢复

基类指针指向派生类对象&派生类指针指向基类对象

在 C++ 中快速将基础对象的所有成员分配给派生对象

基类对象是不是隐式添加到派生类?

在 MFC DLL 中的 CDialog 派生对象中使用 CScrollView 派生对象