Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

private base class??

0 views
Skip to first unread message

我是一隻小小小小鳥

unread,
Jul 15, 1996, 3:00:00 AM7/15/96
to

==> suawe...@cis.nctu.edu.tw (sw) 提到:
> 根據 C++ 的語法來說,一個以 private 方式繼承自 base class
> 的 derived class ,無法用到其 base class 的 member function and
> member variable。
> 這樣的話,為何我們要用 private 的方式來繼承呢??
用private繼承,則母類別中的private variable和member function
子類別不能使用,不過,母類別中宣告成protected和public的在子類別中
會變成private,還是可以給子類別使用.

--
你知道你用的軟體是誰寫的嗎?你又知道那位軟体工程師,
可以稱的上是"成功者"嗎?正如同沒有"偉大的秘書"、"成
功的司機"一樣,寫程式的人頭頂上永遠沒有冠冕。


sw

unread,
Jul 15, 1996, 3:00:00 AM7/15/96
to

根據 C++ 的語法來說,一個以 private 方式繼承自 base class
的 derived class ,無法用到其 base class 的 member function and
member variable。
這樣的話,為何我們要用 private 的方式來繼承呢??

--
* Origin: ★ 交通大學資訊科學系 BBS ★ <bbs.cis.nctu.edu.tw: 140.113.23.3>

sw

unread,
Jul 16, 1996, 3:00:00 AM7/16/96
to

==> 在 cwhua...@physbbs.iams.sinica (阿偉) 的文章中提到:
> ==> suawe...@cis.nctu.edu.tw (sw) 提到:
> > 我同意你的說法,的確,利用 private 的繼承方法,對於 public variable
> > and functions 仍然可以使用,而且用法也如你所舉的例子那樣。
> > 可是有一點我就不了解了:
> > 沿用你的例子,下面的程式就無法 compile 了,
> > A *t_pA;
> > B t_B;
> > t_pA=&t_B; // error!!
> > 這一點就很奇怪了,為何用 private 的方式來繼承,B 就不是 "a kind of " A 呢?
> YES! You got it!!
> C++ 的 private 繼承是用來表示 has a 的概念,而不是
> a kind of! 詳情請見 William 兄翻譯的 C++ FAQ.....
> > 這樣看來,B 和 A 的關係倒像是 B has a A,再次沿用你的例子,
> > 我們是否也可以寫成下面這樣呢:
> 在這個例子,是的!
> 為何不用 member 而要用 private 繼承, 一個原因是為了
> 用到 base class 的 protected member.....
可是不是只能用到 base class 的 public 部份而以嗎?

sw

unread,
Jul 16, 1996, 3:00:00 AM7/16/96
to

==> 在 dy...@ms1.hinet.net (四眼的王蟲) 的文章中提到:

> suawe...@cis.nctu.edu.tw (sw) wrote:
> > 可是不是只能用到 base class 的 public 部份而以嗎?
> 不, 只要是 public 及 protected 的部份都可以用, 這跟到底
> 是 public, protected, or private 繼承無關.

原來如此!!
差一點就養成錯誤的觀念了!
謝謝!

sw

unread,
Jul 16, 1996, 3:00:00 AM7/16/96
to

==> 在 dy...@ms1.hinet.net (四眼的王蟲) 的文章中提到:
> suawe...@cis.nctu.edu.tw (sw) wrote:
> > 根據 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.
0 new messages