这样做是合理的吗?
注意:这是一个最小的工作示例
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_X
或Can_Not_Modify_X
实例的指针(或引用)。您不能通过此引用访问或修改数据成员x
。如果将派生的类指针向上转换为指向类A
的指针,则突然可以修改数据成员x
。通过将x
设为私有,您违反了Liskov替换原则。 x
是数据成员,成员函数还是类型定义都没有关系。您违反了单纯和简单的Liskov替代。
派生类不应隐藏父类提供的功能。