> > 根據 C++ 的語法來說,一個以 private 方式繼承自 base class
> >的 derived class ,無法用到其 base class 的 member function and
> >member variable。
> > 這樣的話,為何我們要用 private 的方式來繼承呢??
> 以 private 方式來繼承 base class 在這個 class 的 scope 內還是
> 可以用 base class 的 member function 及 member variable 呀, 看
> 一下這個例子:
> class A
> {
> public:
> ....
> void setValue(int x);
> .....
> };
> class B: private A
> {
> public:
> ....
> void set(int x)
> {
> setValue(x); //ok, call A::setValue
> }
> .....
> };
> ....
> void test()
> {
> B b;
> b.setValue(1); // error, because B is private derived from A
> }
> 為甚麼需要用 private 方式來繼承呢? 我用 array 與 stack 來說明,
> 假設我們已經定義了一個 array 的 class, 現在要用它來定義一個
> stack 的 class, 那 stack 怎樣繼承 array 呢? 假如用 public 方式繼承
> 結果我們將可以用 array 的 public member function 來操作 stack 而
> 不須要使用 stack 的 push(), pop() 等 member function, 這就違反了
> 封裝的原則, 為避免此一問題 stack 可以用 private 來繼承 array
> 這樣便不能用 array 的 member function 來操作 stack 而必須要用
> stack 的 member function 才可以操作 stack.
我同意你的說法,的確,利用 private 的繼承方法,對於 public variable
and functions 仍然可以使用,而且用法也如你所舉的例子那樣。
可是有一點我就不了解了:
沿用你的例子,下面的程式就無法 compile 了,
A *t_pA;
B t_B;
t_pA=&t_B; // error!!
這一點就很奇怪了,為何用 private 的方式來繼承,B 就不是 "a kind of " A 呢?
這樣看來,B 和 A 的關係倒像是 B has a A,再次沿用你的例子,
我們是否也可以寫成下面這樣呢:
class Stack
{
public:
...
private:
Array m_Array;
};
在這種情況下,Stack 同樣的可以用到 Array 的 public variable and functions.