这样做是合理的吗?

注意:这是一个最小的工作示例

class A {
    public:
        int getX() { return x; }
    protected:
        int x;
        virtual void setX(int newX) = 0;
};

// Children can modify X
class Can_Modify_X : public A {
     protected:
         void setX(int newX) { x = newX; }
     private:
         using A::x;
};

// Children can't modify X
class Can_Not_Modify_X : public A {
     private:
         void setX(int newX) { }
         using A::x;
};


我知道我can't simply hide一个函数,因为那样会违反Liskov原理,但是进行private继承并再次指定所有公共方法似乎真的很多余。

这两个类必须具有一个公共父级(即使直接是其中之一),也不能直接修改x

奖金:在这种情况下,可以有人指出我定义using确切行为的地方吗?我尝试使用谷歌搜索,但收效甚微。

最佳答案

我知道我不能简单地隐藏一个函数,因为那样会违反Liskov原理。


完全相同的概念适用于数据成员。

假设您有一个指向Can_Modify_XCan_Not_Modify_X实例的指针(或引用)。您不能通过此引用访问或修改数据成员x。如果将派生的类指针向上转换为指向类A的指针,则突然可以修改数据成员x。通过将x设为私有,您违反了Liskov替换原则。 x是数据成员,成员函数还是类型定义都没有关系。您违反了单纯和简单的Liskov替代。

派生类不应隐藏父类提供的功能。

10-07 16:57