更改方法的保护级别是否被视为良好做法?

时间:2011-09-28 19:26:36

标签: c++ polymorphism access-specifier

换句话说,如果我有一个班级

class A
{
public:
   A() { .. }
   virtual void somemethod() { .. }
};

可以写

class B : public A
{
public:
   B() { .. }
protected:
   virtual void somemethod() { .. }
};

或者这种方法有一些缺点吗?

4 个答案:

答案 0 :(得分:4)

这种方法的主要缺点是,总是可以对A采用指针/引用,并调用公共的somemethod。你为什么要做这样的事情?如果BA,并且A公开 somemethod,则B也是如此。

答案 1 :(得分:2)

我想说这会破坏多态的目的,因为当你编写一个接受多态类型的函数时,派生类型应该同样适用它:

void fun(A* a){
   a->somemethod();
}
...
A* a = new B();
fun(a); // Shouldn't this work?!
        // According to Liskov Principle, you are doing it wrong!
        // but really who cares, it depends on your justification
        // of a solution to the the problem at hand.
恕我直言,这取决于你要解决的具体问题,因为我不相信“永远”成功的“最佳实践”。

答案 2 :(得分:0)

这种方法有没有缺点。唯一的限制B::somemethod()无法使用B对象/指针/引用调用。现在只能使用A的指针或引用来调用它。

事实上,我已经看到有时会故意引入这种限制。这种情况是class B的开发人员希望使用基类句柄传达somemethod()只能被称为多态的消息。

答案 3 :(得分:0)

没有缺点。

但这样做没有真正的优势。
您仍然可以通过指向案例类的指针访问somemethod()

因此技术方面没有缺点也没有优势 所以现在我们开始讨论使用对象是多么容易。这里有一个缺点,因为你让对象的用户感到困惑(为什么它在这个级别受到保护而不是较低级别)?因此,您正在为自己创建工作,记录您做出此决定的原因以及您尝试使用此技术实现的目标。

你真正想要实现的目标是什么?