2013-02-27 49 views
32

Tôi là người mới bắt đầu với C++ và tôi đang thực hiện một trong các bài tập về lớp trừu tượng và kế thừa.Tại sao thành viên kế thừa không được phép?

Đây là lớp trừu tượng của tôi:

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

Đây là lớp bê tông của tôi mà thực hiện các lớp trừu tượng:

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

tôi có đường màu đỏ dưới area(), perimeter(), và volume() trong lớp Circle của tôi , hiển thị "Error: inherited member is not allowed". Tôi đã đi qua lớp học của tôi ppt và googled cho câu trả lời nhưng không có may mắn. Bất kỳ trợ giúp được đánh giá cao.

+5

bạn vẫn phải khai báo các phương thức ảo trong lớp dẫn xuất. –

+3

'Hình dạng' không trông trừu tượng. Các chức năng thành viên của nó phải là ảo thuần túy cho điều đó. Ngoài ra, nó nên khai báo một destructor ảo. –

+0

Đừng quên khai báo 'ảo ~ Hình dạng() {}' –

Trả lời

42

Bạn phải khai báo các chức năng trên một thanh cuộn như một phần của định nghĩa lớp học của bạn

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

Lưu ý rằng việc sử dụng virtual đây là tùy chọn.

Như n.m. lưu ý, bạn cũng nên bao gồm một destructor ảo trong Shape. Bạn cũng có thể muốn thực hiện chức năng ảo của nó tinh khiết ảo (dựa trên nhận xét của bạn về Shape là trừu tượng)

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

Và sử dụng 'override' trong' Circle' có lẽ là một ý tưởng hay. – bames53

+0

@ bames53 Có từ khóa C++ 'ghi đè' không? Tôi chỉ biết về [phần mở rộng của Microsoft] (http://msdn.microsoft.com/en-us/library/vstudio/41w3sh1c.aspx) nhưng bạn cần phải biết rằng mã chỉ cần để biên dịch với gần đây các phiên bản của MSVC để sử dụng nó. – simonc

+2

@simonc trong C++ 11 – Slava

7

bạn phải khai báo các phương pháp ghi đè quá trong lớp vòng

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

Trước tiên, bạn nên làm cho bạn hình dạng lớp trừu tượng rõ ràng:

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

Bằng cách này bạn không cần phải xác định các phương pháp trong hình dạng lớp và điều gì quan trọng hơn nếu yo u quên ghi đè lên bất kỳ phương thức trừu tượng nào trong lớp dẫn xuất và sẽ cố gắng tạo một thể hiện của nó, trình biên dịch sẽ nhắc nhở bạn. Thứ hai khi bạn ghi đè phương thức ảo trong lớp dẫn xuất bạn cần khai báo chúng:

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

    virtual void area(); 
    virtual void perimeter(); 
    virtual void volume(); 
private: 
    int r; 
}; 
Các vấn đề liên quan