2013-02-27 160 views
32

मैं सी ++ के लिए शुरुआत कर रहा हूं और मैं अमूर्त वर्ग और विरासत के बारे में अभ्यास कर रहा हूं।विरासत में सदस्य को क्यों अनुमति नहीं है?

यह मेरा सार वर्ग है:

#ifndef SHAPE_H 
#define SHAPE_H 
class Shape 
{ 
    public: 
     virtual void area(); 
     virtual void perimeter(); 
     virtual void volume(); 
}; 
#endif 

यह मेरा ठोस वर्ग कि अमूर्त वर्ग को लागू करता है: मेरे Circle कक्षा में

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

class Circle : public Shape 
{ 
    public: 
     Circle(int); 
    private: 
     int r; 
}; 

Circle::Circle(int rad) 
{ 
    r = rad; 
} 

void Circle::area() 
{ 
    cout << "Area of this cirle = " << 3.14 * pow(r, 2) << endl; 
} 

void Circle::perimeter() 
{ 
    cout << "Perimeter of this cirle = " << 2 * 3.14 * r << endl; 
} 

void Circle::volume() 
{ 
    cout << "Volume is not defined for circle." << endl; 
} 

मैं, area() के तहत लाल लाइनों मिला perimeter(), और volume() , जो "Error: inherited member is not allowed" दिखाया गया। मैं अपने वर्ग के पीपीटी के माध्यम से गया और जवाब के लिए googled लेकिन कोई भाग्य नहीं। किसी भी मदद की सराहना की है।

+5

आप अभी भी एक व्युत्पन्न वर्ग में आभासी तरीकों घोषित करने के लिए है। –

+3

'आकार' सार नहीं दिखता है। इसके सदस्य कार्यों के लिए शुद्ध आभासी होना चाहिए। इसके अलावा, इसे एक आभासी विनाशक घोषित करना चाहिए। –

+0

'वर्चुअल ~ आकार() {}' –

उत्तर

42

आप अपने वर्ग परिभाषा

class Circle : public Shape 
    { 
    public: 
     Circle(int); 
     virtual void area(); // overrides Shape::area 
     void perimeter(); // overrides Shape::perimeter 
     virtual void volume(); 
    private: 
     int r; 
    }; 

ध्यान दें कि virtual यहां उसका उपयोग वैकल्पिक है के भाग के रूप में पदभार ग्रस्त कार्यों की घोषणा करने के लिए है।

एनएम के रूप में। ध्यान दिया गया है, आपको Shape में वर्चुअल विनाशक भी शामिल करना चाहिए।

class Shape 
{ 
public: 
    virtual ~Shape() {} 
    virtual void area() = 0; 
    virtual void perimeter() = 0; 
    virtual void volume() = 0; 
}; 
+0

और 'सर्कल' में 'ओवरराइड' का उपयोग करना शायद एक अच्छा विचार है। – bames53

+0

@ bames53 क्या कोई सी ++ 'ओवरराइड' कीवर्ड है? मुझे केवल [माइक्रोसॉफ्ट एक्सटेंशन] (http://msdn.microsoft.com/en-us/library/vstudio/41w3sh1c.aspx) के बारे में पता है, लेकिन आपको यह जानना होगा कि कोड को हाल ही में संकलित करने की आवश्यकता है इसका उपयोग करने के लिए एमएसवीसी के संस्करण। – simonc

+2

@ +imonc C++ 11 में – Slava

7

(अपनी टिप्पणी के बारे में Shape सार जा रहा है के आधार पर) तुम भी अपने आभासी कार्यों शुद्ध आभासी बनाने के लिए चाहते हो सकता है आप सर्किल वर्ग

class Circle : public Shape 
    { 
    public: 
     Circle(int); 
     virtual void area(); 
     virtual void perimeter(); 
     virtual void volume(); 
    private: 
     int r; 
    }; 
1

सबसे पहले आपको चाहिए में भी ओवरराइड तरीकों घोषित करने के लिए है

class Shape 
{ 
public: 
    virtual void area() = 0; 
    virtual void perimeter() = 0; 
    virtual void volume() = 0; 
}; 

इस तरह से आप को परिभाषित करने के उस वर्ग आकार में विधियों, और अगर यो अधिक महत्वपूर्ण क्या है की जरूरत नहीं है: आप वर्ग स्पष्ट रूप से अमूर्त आकृति बनाने आप व्युत्पन्न वर्ग में किसी भी अमूर्त विधि को ओवरराइड करना भूल जाते हैं और इसका एक उदाहरण बनाने का प्रयास करेंगे, संकलक आपको याद दिलाएगा। दूसरा जब आप व्युत्पन्न वर्ग में आभासी विधि ओवरराइड आप उन्हें घोषित करने के लिए की जरूरत है:

class Circle : public Shape 
{ 
public: 
    Circle(int); 

    virtual void area(); 
    virtual void perimeter(); 
    virtual void volume(); 
private: 
    int r; 
};