2013-05-08 163 views
2

我在類A中的靜態成員變量和B類從類A.靜態成員是否被繼承?

class A 
{ 
    public: 
    A() 
    { 
     a = 3; 
    } 
    static int a; 
}; 

int A::a = 0; 

class B : public A 
{ 
    public: 
    B() 
    { 
     a = 4;   
    } 
}; 

void main() 
{ 
    A objA; 
    cout << "Before:" << A::a; 
    B obj; 
    cout << endl << "After:" << A::a; 
} 

導出作爲每Are static fields inherited?當派生類型對象由那麼它也產生基本類型。 我有以下問題:

  1. 它是如何,而不是A::a我也可以訪問objA.a?不應該通過該類的對象訪問靜態變量。

  2. 如果對於派生類還創建了一個新的靜態變量(特定於class B),那麼爲什麼沒有必要初始化class B的靜態變量?

  3. 爲什麼輸出下面所示:

前:3

後:4

當預計將顯示3之前和之後?

+0

標題的答案取決於您對術語*定義的定義*是。 – 2013-05-08 17:22:56

回答

2

對靜態變量的訪問是繼承的。請注意,具有私人訪問權的靜態會員將無法訪問,因爲這是protected關鍵字的用途。

+0

但是,這是問的答案? – anurag86 2013-05-08 17:17:04

+1

@ user2287617:這是標題中提出的問題的答案,但不包括身體中三個鬆散相關的問題。 – 2013-05-08 17:21:56

+4

這根本就是錯的。不論是否私人,_all_成員都被繼承。 – 2013-05-08 17:27:38

1

您的根本問題是您錯誤地解釋了您鏈接到的問題中的答案。當你推導出類B時你不要做一個新的靜態變量a

所以,A::aB::a是相同的變量。一旦你糾正了這種錯誤理解,其他一切都將是明顯而清晰的。

看你的代碼:

A objA; //A() executes which sets A::a to 3 
cout << "Before:" << A::a; //outputs 3 
B obj; //now B() executes and sets B::a to 4 
cout << endl << "After:" << A::a; //outputs 4 since A::a is same variable as B::a 

它是如何,而不是A ::一我也可以訪問objA.a?

因爲語言規範說你可以。語言規範說A::aobjA.a是相同的變量。這包括在任何有關該語言的良好指南中。例如,網上你可以閱讀cppreference.com它說,它是這樣的:

要引用T類的靜態成員N,可以使用兩種形式:標準名稱T ::米或成員訪問表達EM或電子郵件 - > m,其中e是分別計算爲T或T *的表達式。在同一個班級範圍內,資格是不必要的。

+0

請注意我在兩種情況下都不使用B :: a,它的A :: a。 – anurag86 2013-05-08 17:14:16

+0

另請注意,將創建新的靜態變量是指證明它的鏈接。 – anurag86 2013-05-08 17:15:02

+4

沒錯 - 沒有'B ::了',只有Zuul..no等待,只有'A ::了'(對不起,@大衛 - 赫弗南的頭像給我捉鬼敢死隊倒敘) – 2013-05-08 17:16:34

0
  1. 靜態變量可通過該類的對象訪問。他們爲什麼不呢?
  2. 任何靜態變量只有一個副本。如果另一個類繼承它,它只能訪問相同的靜態變量,而不是另一個副本。
  3. 因爲B::B()已將A::a更改爲4. BA共享訪問A::a
1
  1. 這裏沒有objA.a,有訪問內B()構造函數,其中A ::一個是可見的,因此可以視作 「一個」 訪問。 B :: a是指內存中的相同地址,B :: a沒有新的靜態變量,它可以通過& B :: a檢查。

  2. 預計不會是3和3,因爲行「B obj」,因此預計爲3和4。改變A :: a值,並且因爲(2)它與B :: a(即B()構造器改變A :: a)相同的變量。

+0

您確實可以訪問使用'objA.a'變量。 – 2013-05-08 17:45:09

+0

糟糕。老東西學習,謝謝。 – queen3 2013-05-08 18:18:05

0

靜態成員是否被繼承?

從這個意義上說,基類的靜態成員也是任何派生類的靜態成員,是的。

這是怎麼回事,而不是A::a我也可以訪問objA.a。靜態變量不應該可以通過該類的對象訪問。

這就是語言的定義。兩者都是等價的,如果不能輕鬆寫出對象的類型,則對象樣式可以更方便。

如果派生類也創建了一個新的靜態變量(特定於類B),那麼爲什麼沒有必要初始化類B的靜態變量?

沒有特定於類B的新靜態變量; A只有一個。繼承意味着它也在類B的範圍內;但A::aB::a都指向相同的變量。

爲什麼當預計顯示3爲前後時,下面的輸出顯示爲[3,4]?

如上所述,僅存在一個變量,以及B套它構造函數4

+1

關於使用對象樣式的:像'這個 - >了'(而不是僅僅'了')可以在模板中有用,使變量名相關。 – 2013-05-08 17:30:21