2013-02-27 68 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; 
}; 
相关问题