2013-02-20 44 views
2

我是C++編程新手,我正在閱讀繼承概念,我對繼承概念有疑問,即:如果基類和派生類具有相同的數據成員,會發生什麼情況。還請大家通過我的代碼如下:基數和派生類中的相同數據成員

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

class ClassA 
{ 
    protected : 
     int width, height; 
    public : 
     void set_values(int x, int y) 
     { 
      width = x; 
      height = y; 
     } 
}; 
class ClassB : public ClassA 
{ 
    int width, height; 
    public : 
     int area() 
     { 
      return (width * height); 
     } 
}; 

int main() 
{ 
    ClassB Obj; 
    Obj.set_values(10, 20); 
    cout << Obj.area() << endl; 
    return 0; 
} 

在我聲明數據成員具有相同名稱作爲基類的數據成員上面,我叫​​功能與派生類對象初始化數據會員widthheight

當我打電話的area()功能,爲什麼會返回一些垃圾值,而不是返回正確的值。只有當我在派生類中聲明與基類數據成員具有相同名稱的數據成員時纔會發生。如果我刪除派生類中聲明的數據成員,它工作正常。那麼派生類中的聲明有什麼問題?請幫幫我。

回答

5

B隱藏(或陰影)那些Awidth的和height數據成員。

他們起不到任何有益的作用在這種情況下,應予以刪除

如果您要訪問的隱藏(或陰影)數據成員,您可以使用範圍解析:

 int area() 
     { 
      return (A::width * A::height); 
     } 
+0

好的罰款..但派生類繼承set_values()函數那麼爲什麼它不是初始化派生類中聲明的數據成員。 – nagaradderKantesh 2013-02-20 05:52:25

+1

因爲基類不知道派生類的成員。嘗試從'ClassA'中刪除'width'和'height',看看會發生什麼。 – Aesthete 2013-02-20 05:54:42

+0

好的..如果我刪除,它會正常工作。讓我們假設在派生類中沒有數據成員聲明,​​並且當我調用set_values()函數時,它初始化基類的寬度和高度成員,同樣會反映在area()函數中,但是如果在派生類中聲明數據成員爲什麼set_values ()函數不會初始化派生類數據成員,即使它是由派生類繼承的。 – nagaradderKantesh 2013-02-20 06:10:22

相關問題