2013-02-27 35 views
32

C++ 'ya yeni başlıyorum ve soyut sınıf ve miras ile ilgili alıştırmalardan birini yapıyorum.Kalıtsal üyeye neden izin verilmiyor?

Bu benim soyut sınıftır:

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

Bu benim somut soyut sınıf uygulayan sınıftır: my Circle sınıfta

#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; 
} 

Ben area() altında perimeter() kırmızı çizgilerini var ve volume()"Error: inherited member is not allowed" gösterdi. Sınıf ppt'imden geçtim ve cevap için googled ama şans yok. Herhangi bir yardım takdir edilir.

+5

hala bir türetilmiş sınıftaki sanal yöntemleri beyan etmek zorunda. –

+3

'Shape' soyut görünmüyor. Üye fonksiyonları bunun için tamamen sanal olmalıdır. Ayrıca, sanal bir yıkıcı ilan etmelidir. –

+0

Sanallaştırmayı bildirmeyi unutmayın ~ Shape() {} ' –

cevap

42

Sen sınıf tanımının burada virtual kullanımı isteğe bağlı olduğunu

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

Not parçası olarak aşırı basmış işlevleri beyan etmek zorunda.

n.m. Ayrıca, Shape'da bir sanal yıkıcı bulundurmalısınız. Ayrıca kendi sanal işlevleri yalnızca sanal yapmak isteyebilirsiniz Circle sınıfında

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

Ve 'Circle' içinde' geçersiz kıl 'seçeneğini kullanmak muhtemelen iyi bir fikirdir. – bames53

+0

@ bames53 C++ 'geçersiz kılmalar 'anahtar kelimesi var mı? Yalnızca [Microsoft uzantısı] 'nın (http://msdn.microsoft.com/en-us/library/vstudio/41w3sh1c.aspx) farkındayım, ancak kodun yalnızca son zamanlarda derlemek için gerekli olduğunu bilmeniz gerekiyor. Bunu kullanmak için MSVC sürümleri. – simonc

+2

@simonc in C++ 11 – Slava

7

(yaklaşık Shape olmanın soyut Yorumlarınız göre)

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

sınıf Shape yöntemleri ve yo eğer daha önemli ne olduğunu tanımlamak gerekmez Bu şekilde: açıkça soyut sınıf Şekle yapmak türetilmiş sınıftaki herhangi bir soyut yöntemi geçersiz kılmayı unutmuşsunuz ve bunun bir örneğini oluşturmaya çalışacağız, derleyici size hatırlatacaktır. Türetilmiş bir sınıf içinde sanal yöntemi geçersiz olduğunda İkinci bunları ilan etmek gerekir:

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

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

İlk yapmanız gerekir çok geçersiz kılma yöntemleri beyan etmek zorunda

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