2013-02-27 67 views
32

我是C++的初學者,我正在做關於抽象類和繼承的練習之一。爲什麼繼承成員不被允許?

這是我的抽象類:

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

這是我的具體類實現抽象類:

#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()在我Circle類,其中顯示"Error: inherited member is not allowed"。我經歷了我的課程ppt並用Google搜索,但沒有運氣。任何幫助表示讚賞。

+5

你還是要聲明在派生類中的虛方法。 – 2013-02-27 16:48:11

+3

'形狀'看起來不抽象。它的成員函數應該是純虛擬的。另外,它應該聲明一個虛擬析構函數。 – 2013-02-27 16:52:27

+0

不要忘記聲明'virtual〜Shape(){}' – 2013-02-27 16:52:28

回答

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這裏是可選的一部分。

至於n.m.注意,你還應該在Shape中包含一個虛擬析構函數。您可能還需要做出自己的虛函數純虛(根據您的評論對Shape是抽象的)

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

在'Circle'中使用'override'可能是一個好主意。 – bames53 2013-02-27 16:58:41

+0

@ bames53有沒有C++'override'關鍵字?我只知道[Microsoft擴展](http://msdn.microsoft.com/en-us/library/vstudio/41w3sh1c.aspx),但您需要知道代碼只需要用最近編譯MSVC版本使用它。 – simonc 2013-02-27 17:01:19

+2

@simonc in C++ 11 – Slava 2013-02-27 17:05:11

7

,你必須在Circle類

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

首先,你應該也聲明重寫方法讓你Shape類明確摘要:

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

這樣你就不必在類Shape中定義那個方法了,更重要的是如果喲你忘記重寫派生類中的任何抽象方法,並嘗試創建它的一個實例,編譯器會提醒你。 其次,當你重寫派生類中的虛方法需要聲明他們:

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

    virtual void area(); 
    virtual void perimeter(); 
    virtual void volume(); 
private: 
    int r; 
}; 
相關問題