c++ 為什麼不允許繼承成員?




c++ polymorphism (3)

你必須在Circle類中聲明重寫方法

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

我是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;
}

我的Circle類中的area()perimeter()volume()下面有紅線,顯示"Error: inherited member is not allowed" 。 我通過我的班級ppt和谷歌搜索答案,但沒有運氣。 任何幫助表示讚賞。


Answer #1

您必須將過度使用的函數聲明為類定義的一部分

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是可選的。

正如nm所說,你還應該在Shape包含一個虛擬析構函數。 您可能還希望將其虛擬函數設置為純虛擬(基於您對Shape的抽象註釋)

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

Answer #2

首先,你應該讓你的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;
};






inheritance