前端时间看了《Effective C++》,里面对public继承和private继承的解释,我感觉有点迷糊,public还好说,is-a关系。但private继承却不是很理解。知道这几天看了设计模式中的适配器模式,才略有理解。
如果有不同意见或我的想法有错,请指出,也欢迎和大家交流、共同进步。
里面关于适配器中一部分的代码是这样的:
//使用继承,类模式
class Deque //双端队列,被适配类
{
public:
void push_back(int x)
{
cout << "Deque push_back:" << x << endl;
}
void push_front(int x)
{
cout << "Deque push_front:" << x << endl;
}
void pop_back()
{
cout << "Deque pop_back" << endl;
}
void pop_front()
{
cout << "Deque pop_front" << endl;
}
};
class Sequence //顺序类,目标类
{
public:
virtual void push(int x) = 0;
virtual void pop() = 0;
};
class Stack:public Sequence, private Deque //栈, 适配类
{
public:
void push(int x)
{
push_back(x);
}
void pop()
{
pop_back();
}
};
class Queue:public Sequence, private Deque //队列,适配类
{
public:
void push(int x)
{
push_back(x);
}
void pop()
{
pop_front();
}
};
//END
可以看到,Stack和Queue 均 public继承Sequence, private继承 Deque
这表明:
1、Stack/Queue is a Sequence。
2、Stack/Queue 是根据 Deque 实现出。
第一点很好理解,栈和队列都是顺序表。
第二点,根据《EC》一书上的解释,Stack/Queue采用了Deque中已经备妥的某些特性(push_back(), pop_front()),不是因为Stack/Queue和Deque存在有任何观念上的关系。private继承纯粹只是一种实现技术(利用Deque实现出Stack/Queue),因此base class中的每样东西在derived class中都是private的。private继承意味着只有实现部分被继承,接口部分应略去。
Private继承在软件设计层面上没有意义,其意义只及于软件实现层面。