You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:15:31