2016-11-22 47 views
0

我想設計一個類,它提供了一個函數,根據它的某個屬性來執行某些操作。我也想做同樣的過程,但有了另一個值,這就是爲什麼我創建了派生類並修改了屬性。C++繼承與不使用getter的const成員

首先,我創建了一個靜態屬性,因爲該值不取決於每個對象,而是取決於類本身。或者,我不能繼承一個靜態屬性並修改每個類的一個。

然後,我決定把我的屬性在const中能夠使用繼承。我做了一個簡單的程序來向你展示我的問題。在這裏,我希望foo顯示調用該方法的對象的值,而不是父級的值。另外,我不想使用getter,因爲我會在我的方法中多次使用變量,這是用於圖像處理的。

#include <iostream> 

// Compile it with 
// g++ -o child_test child_test.cpp -std=c++11 

class Parent{ 
    public: 
     Parent() {}  
     virtual void foo(){ 
      printf("%d\n", this->bar); 
     }  
    private:  
     const int bar = 0;  
};  

class Child : public Parent{  
    public: 
     Child() : Parent() {} 
    private: 
     const int bar = 10; 
}; 

int main(){  
    Parent * p = new Parent(); 
    p->foo(); // Output : 0 

    Child * c = new Child(); 
    c->foo(); // Output : 0 ? How could it be 10 

    Parent * cp; 
    cp = new Child(); 
    cp->foo(); // Output : 0 ? How could it be 10 
} 

回答

4

這不是語言的工作原理。該函數可能是虛擬的,但成員變量(常量)不是。

如果你想在基類中有一個不同的值,把它傳給構造函數。

class Parent{ 
    public: 
     Parent(int value = 0) : bar(value) {}  
     virtual void foo(){ 
      printf("%d\n", this->bar); 
     }  
    private:  
     const int bar = 0;  
};  

class Child : public Parent{  
    public: 
     Child() : Parent(10) {} 
}; 
+0

好吧,所以我需要在構造函數中實例化它?否則,電話不會聯絡。這是可能的靜態變量? –

0

C-> FOO(); //輸出:0?它怎麼可能是10

你有兩個成員變量bar,一個在Parent類,一個在Child。你foo功能不是純粹的虛擬,這是Child類沒有覆蓋),所以默認它調用Parent執行(已具有bar變量) - 這就是爲什麼輸出爲0

如果重寫(例如,具有相同的功能foo)在Childfoo類功能,輸出爲10

+0

是的但是如果foo做了很多的調用,我需要重寫孩子的代碼?或者調用父方法將與子屬性聯繫? –

2

C-> FOO(); //輸出:0?怎麼可能10

你可以改變你訪問的方式bar。而不是使其成爲成員變量,請使用返回值的成員函數virtual

class Parent{ 
    public: 
     Parent() {}  
     virtual void foo(){ 
      printf("%d\n", this->bar()); 
     }  
    private:  
     virtual int bar() const 
     { 
      return 0; 
     } 
};  

class Child : public Parent{  
    public: 
     Child() : Parent() {} 
    private: 
     virtual int bar() const 
     { 
      return 10; 
     } 
}; 
+0

難道不需要更多的內存?因爲在我的真實情況下,我的屬性是二維數組,所以如果我需要使用getter no,那麼它的優化會更少一些? –

+0

@KevinM,不是不需要更多的記憶。事實上,情況恰恰相反。每個對象不會攜帶兩個「int」。無論如何,你正在提出一個正交的話題。如果這是您的問題,請發佈另一個問題。 –