2016-04-15 4 views
-2

Я пытаюсь создать круг и прямоугольник из формы класса. Я хочу, чтобы y был назначен pi, если я вызываю конструктор Shape() с параметром (из класса окружения). Поскольку Shape имеет чисто виртуальную функцию, компилятор показывает ошибку. Как я могу преодолеть эту ошибку. И почему параметр по умолчанию работает правильно? Также я попробовал this-> Shape (0) из класса Circle. Компилятор говорит «Неправильное использование этого»Как получить доступ к конструктору родительского класса в C++ с родительским классом, имеющим чистую виртуальную функцию

#include<iostream> 
using namespace std; 

class Shape 
{public: 
double x,y; 

    Shape() 
    {x=0;y=0;} 

    Shape(int p,int t=3.14159) 
    {x=p;y=t;} 

    virtual void display_area()=0; 
    virtual void get_data()=0; 
}; 



class Circle: public Shape 
{public: 

    Circle() 
    {Shape(0);} //ERROR HERE 

    void get_data() 
    {cout<<"\nRadius: ";cin>>x;} 

    void display_area() 
    {cout<<"\nArea: "<<y*x*x;} 
}; 
+2

Никаких чудес, которые вы не можете исправить код, если он так плохо отформатирован. Правило №1: правильно отформатируйте свой код! – SergeyA

+0

Почему ваш код так плохо отформатирован? Как вы можете это прочитать? –

ответ

2

базовые классы всегда инициализируются перед запуском блока конструктора, так что вы делаете это в конструктор-х member initialization list ..

Я также фиксированной другой ошибка в вашем коде .... Вы делаете некоторые сужающиеся преобразования, которые не будут работать так, как вы хотите ...

#include<iostream> 
using namespace std; 

class Shape 
{ 
public: 
    double x,y; 

Shape() 
{ 
    x=0; 
    y=0; 
} 

Shape(double p, double t=3.14159) //changed from Shape(int p, int t=3.14159) 
{ 
    x=p; 
    y=t; 
} 

virtual void display_area()=0; 

virtual void get_data()=0; 
}; 

class Circle: public Shape 
{ 
public: 
    Circle() : Shape(0) 
{ /*Shape(0); */ } //Not HERE 

void get_data() 
{ 
    cout<<"\nRadius: "; 
    cin>>x; 
} 

void display_area() 
{ 
    cout<<"\nArea: "<<y*x*x;} 
}; 
+0

Спасибо за помощь –

2

Для вызова базового конструктора вам нужно использовать member initialization list.

Изменение:

Circle() 
{ 
    Shape(0); 
} //ERROR HERE 

К

Circle() : Shape(0) 
{ 

} 
+0

Спасибо Jose Код работал, но его показывающие целые числа вместо десятичных знаков –

+0

Shape (0) вызывает второй конструктор (который принимает два ints, а не плавает или удваивает). Поскольку первый int установлен в 0, а t устанавливается в 3 * 0 = 0. Возможно, вы захотите изменить второй конструктор, чтобы принять парные. – Jts