2013-07-24 182 views
0

是否有一個優雅的c-way(除了簡單地設置一個變量等於)(雙關語意)從一個不同於名稱的類中繼承一個變量?在Python中有as關鍵字混淆的東西,有沒有這樣的方法在C + +?繼承相同的變量,但不同的名稱

即:

class special_type_of_grid 
{ 
    protected: double** special_grid; 
    public: special_type_of_grid(); 
} 
class integrator: protected special_type_of_grid 
{ 
    private: /*grid alias special_grid*/ 
    public: void integrate(){ 
     //... 
     sum += grid[i][j]*h; 
     //...} 
} 

,這樣可以有一個以上的「特型格」。

我想一個好的方法來做到這一點將是一個指針初始化在構造函數,但它可以在私人/公共範圍內完成?

+2

什麼是「優雅」? –

+1

你爲什麼需要?這樣做會破壞封裝,派生類只能通過父類提供的訪問器與父類的成員進行交互。 – Mgetz

+1

爲什麼你想要有這樣的功能?這似乎只會造成混淆,因爲相同類型的層次結構將通過不同的名稱引用相同的值。 – JaredPar

回答

0

C++沒有辦法做到這一點。不過,有可能做到這一點,但它是一種很不好的風格。

class Base { 
    int x; 
}; 

class Derived : public Base { 
public: 
    Derived() : y(x) { 
     // ctor code here 
    } 
private: 
    int& y; 
}; 

這個例子表明,你可以做很多與C++奇怪的事情,但如果你認爲這是唯一的解決辦法比你有一個不好的設計在其他地方。此外,您應該添加: y(x)到所有的Derived ctors。

更好的(也是更多的OOP風格)解決方案是使用getters/setters。

class Derived : public Base { 
    int& y() { return x; } 
}; 

甚至更​​好:

class Derived : public Base { 
    int getY() { return x; } 
    void setY(int value) { x = value; } 
}; 

但是,這可能會引起混淆和誤解的人誰將會閱讀你的代碼。

+0

它看起來很糟糕,但你能解釋如何使用:y(x),或者它是如何工作的? – Couchy311

+0

@ user1888743這意味着當你構造Derived對象比x傳遞給y的構造器。應該這樣做,因爲引用沒有默認的構造函數。 –

+0

@ user1888743這是引入「成員初始化列表」的語法,它是唯一的方法來初始化'y'(這裏用'x'),因爲它是一個引用(你不能這樣做'Derived(){y = x;}' )。 –

相關問題