换句话说,如果我有一个类更改方法的保护级别是否被认为是很好的做法?
class A
{
public:
A() { .. }
virtual void somemethod() { .. }
};
是它确定写
class B : public A
{
public:
B() { .. }
protected:
virtual void somemethod() { .. }
};
,还是有一些缺点这种方法?
换句话说,如果我有一个类更改方法的保护级别是否被认为是很好的做法?
class A
{
public:
A() { .. }
virtual void somemethod() { .. }
};
是它确定写
class B : public A
{
public:
B() { .. }
protected:
virtual void somemethod() { .. }
};
,还是有一些缺点这种方法?
我会说这违背了多态性的目的,因为当你写一个接受多态类型的函数,派生类型应与它工作得很好:
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.
恕我直言,这取决于具体的你试图解决的问题,因为我不相信“永远”成功的“最佳实践”。
该方法的主要缺点是人们总是可以采取指针/参考A
并调用somemethod
哪里是公开的。你为什么想要做这样的事情?如果B
是A
和A
都有公开somemethod
那么B
s也是如此。
因为如果你有一个类,你可能想限制某些方法的可访问性。例如如果你在基类中有方法A(int),A(char),A(double)也许你想在派生类中使用A说只允许A(char) –
替代方法是抛出一个异常当在错误的背景下使用时,但我认为可能更好地限制方法的使用。 –
@Anders K .:重新设计你的课程可能会更好。在这种情况下,遗产不应该是私人的吗? –
有没有缺点用这种方法。唯一的限制是B::somemethod()
不能用B
对象/指针/引用调用。现在只能使用A
的指针或引用来调用它。
事实上,我看到有时候这个限制是故意引入的。这种情况是当class B
的开发人员想要传达这样的消息,即somemethod()
旨在被称为仅使用基类句柄多态地。
没有缺点。
但是没有真正的优势来做到这一点。
您仍然可以通过指向案例类的指针访问somemethod()
。
所以在技术方面没有缺点和优点。
所以现在我们转移到使用你的对象是多么容易。这里有一个缺点,因为你混淆了对象的用户(为什么它在这个级别受到保护,而不是在较低级别)?所以你正在为自己创造工作,记录你为什么做出这个决定,以及你通过使用这种技术试图达到什么目的。
你真的想达到什么目的?
挂起,所以有一个缺点,但没有缺点?有什么不同? –
没有'技术'缺点。缺点是对用户来说都是精神上的问题。 –
这将工作。 – iammilind
那么,它从语言/编译器的角度来看,但为什么你会首先定义一个虚拟函数。 – AraK