如何在if语句中避免使用<dynamic_cast>处理多态Post类权限判断?
问题:无dynamic_cast下兼容Post与IncomingPost的权限判断实现
场景与限制
- 涉及类:
User(存储用户信息)、Network(邻接表连接用户)、Post(含帖子ID、内容、点赞数)、IncomingPost(继承Post,新增IsPublic布尔标记公开/私有) - 需求:实现
User::displayPosts函数,当showOnlyPublic为true时仅显示公开帖子——普通Post默认视为公开,IncomingPost需判断IsPublic值 - 限制:禁止使用
dynamic_cast,无法直接调用Post对象的getIsPublic方法
现有代码片段
// post: returns a string shows the most recent howmany posts std::string User::displayPosts(std::size_t howmany, bool showOnlyPublic) { std::string out; std::size_t messagecount = 0; for (int i = 0; i < messages_.size(); i++) { if (showOnlyPublic) { // ************************* PART IN QUESTION IS BELOW ****************************** // how to only get isPublic if its an IncomingPost? // if the post is private if (){ // what to put in here? if (messages_[i]->getIsPublic() == false) { continue; } } messagecount++; out = out + (messages_[i]->displayPost()) + "\n\n"; } else { out = out + (messages_[i]->displayPost()) + "\n\n"; messagecount++; } } return out; }
解决方案:利用多态统一权限判断逻辑
核心思路是给基类Post添加虚方法,让子类IncomingPost重写该方法,通过多态自动适配不同类型的权限判断,完全规避类型检查:
步骤1:给基类Post添加虚函数
在Post类中新增一个默认返回true的虚函数isPublic()(因为普通Post视为公开):
class Post { // 原有成员变量:帖子ID、内容、点赞数等 public: // 原有成员方法... virtual bool isPublic() const { return true; // 普通Post默认公开 } };
步骤2:子类IncomingPost重写虚函数
在IncomingPost类中重写isPublic(),返回自身的IsPublic属性值:
class IncomingPost : public Post { private: bool isPublic_; // 类内存储的公开状态标记 public: // 原有成员方法... bool isPublic() const override { return isPublic_; // 返回自身的公开状态 } // 原有getIsPublic()方法可保留或直接用此虚函数替代 };
步骤3:修改displayPosts的判断逻辑
直接调用统一的isPublic()虚方法,多态会自动匹配对应类的实现:
std::string User::displayPosts(std::size_t howmany, bool showOnlyPublic) { std::string out; std::size_t messagecount = 0; // 补充howmany参数的限制(原代码未使用该参数) for (int i = 0; i < messages_.size() && messagecount < howmany; i++) { if (showOnlyPublic && !messages_[i]->isPublic()) { continue; // 私有帖子跳过 } out += messages_[i]->displayPost() + "\n\n"; messagecount++; } return out; }
补充说明
- 该方案符合面向对象多态设计原则,完全避免了显式类型判断,无需使用
dynamic_cast - 原代码未利用
howmany参数,建议添加messagecount < howmany的循环终止条件,保证返回指定数量的帖子
内容的提问来源于stack exchange,提问作者Hayoung Ryow
相关产品推荐
相关产品推荐

