Member 13057504 Ответов: 2

Ниже приведен код работы с произвольными ошибка:'форма' является недоступной базы 'аналогичная ошибка круг' для 'прямоугольника' и 'треугольник' класса. Как устранить эту ошибку?


создание членов: x, y класса shape публичное от защищенного. Но ничего не вышло! Не удалось выяснить причину ошибки. Пожалуйста, помогите.

Что я уже пробовал:

#include<iostream>
using namespace std;
class shape
{
protected:
    int x,y;
    float ar;
    public:
    virtual void cal_area()=0;
    virtual void get()=0;
};
class circle:shape
{
public:
    void get()
    {
        cout<<"\nenter radius\n";
        cin>>x;
    }
    void cal_area()
    {
        ar=3.14*x*x;
        cout<<"\narea of circle="<<ar;
    }
};
class triangle:shape
{
    public:
    void get()
    {
        cout<<"\nenter base and height\n";
        cin>>x>>y;
    }
    void cal_area()
    {
        ar=(float)1/2*x*y;
        cout<<"\narea of triangle="<<ar;
    }
};
class rect:shape
{
public:
    void get()
    {
        cout<<"\nenter length and width\n";
        cin>>x>>y;
    }
    void cal_area()
    {
        ar=x*y;
        cout<<"\narea of rectangle="<<ar;
    }
};
int main()
{
    circle c1;
    triangle t1;
    rect r1;
    /*c1.get();
    t1.get();
    r1.get();*/
    shape *sp;
     sp=&c1;
     sp->get();
    sp->cal_area();
    sp=&t1;
    sp->get();
    sp->cal_area();
    sp=&r1;
    sp->get();
    sp->cal_area();
    return 0;
}

2 Ответов

Рейтинг:
2

CPallini

Изменение от

Цитата:
классный круг: форма
класс треугольник: форма
класс прямоугольник:форма


к
class circle: public shape
class triangle: public shape
class rect: public shape


Видеть Наследование C++ [^].


Member 13057504

теперь код работает абсолютно нормально через публичное наследование, но в чем была проблема с частным наследованием?

CPallini

Ты читал ссылку?
"Частное наследование: при выводе из частного базового класса открытые и защищенные члены базового класса становятся частными членами производного класса."
(частный наследование используется по умолчанию, когда базовый тип является классом)
Так общественный члены Форма становится частным членом, например, Круг.

Member 13057504

но так как я написал в коде: sp=&c1 означает, что указатель базового класса содержит адрес объекта производного класса.Таким образом, оператор:sp->get() и функция sp->cal_area() в это время относятся к функциям-членам производного класса:circle, а не к функциям-членам базового класса. а поскольку эти функции являются публичными членами класса circle, следовательно, должны быть доступны вне класса!

CPallini

Некоторое понимание здесь:
http://www.bogotobogo.com/cplusplus/private_inheritance.php