2014-01-22 3 views
0

Я новичок в CPP и до сих пор я следующие:Использование конструкторов из абстрактных классов в других классах

Форма HPP:

class Shape 
{ 
public: 
    Shape(int x, int y); 
    ~Shape(); 
    virtual void area(); 
    bool positive(int x, y); 
private: 
    int x; 
    int y; 
}; 

Форма каст:

Shape::Shape(int x, int y) 
{ 
    x = x; 
    y = y; 
} 

bool Shape::positive(int x, int y) 
{ 
    return true; 
} 

Площадь HPP :

class Square : public Shape 
{ 
private: 
    virtual void area(); 
}; 

И Площадь каст:

#include <iostream> 
using namespace std; 

void Shape::area() 
{ 
    cout << "Temp" << endl; 
} 

Я пытаюсь вызвать код из Main, как так:

Square sq; 
sq.area(); 

Это не работает, и я знаю, я пропускаю что-то делать с конструктору Square класса, однако я я не уверен, как наследование работает в cpp, и я боюсь его понять.

Объяснение с помощью исправлений к примеру было бы очень полезно или ссылки на хороший учебник.

Благодаря

ответ

3

Вы задающие Shape::area вместо Square::area в Shape.cpp. Заменить: void Shape::area() с void Square::area().

Кроме того, вы пытаетесь создать объект Square со стандартным конструктором, даже если он не имеет. Использовать:

Square sq(a, b); 

вместо этого или определить его.

Старайтесь избегать using namespace std и привыкать к префиксу std::. Это будет полезно в будущем.

И, наконец, я не вижу определения для virtual void Shape::area(). Вы, вероятно, имел в виду, чтобы объявить его чисто виртуальная:

virtual void area() = 0; 

На этой ноте, деструктор Shape должен быть объявлен виртуальным:

virtual ~Shape(); 

, если вы собираетесь класс будет использоваться полиморфно.

Вы также не определили конструктор для Square, который необходим, поскольку конструктор по умолчанию больше не является жизнеспособным (поскольку ни один из них не доступен в Shape). Просто определить один, как это:

class Square { 
public: 
    Square(int x, int y) : Shape(x, y) {} 
    // ... 
}; 

выше конструктор будет делегировать строительство субобъекта Shape к соответствующему конструктору.

Не говоря уже о том, что в:

Shape::Shape(int x, int y) 
{ 
    x = x; 
    y = y; 
} 

вы затенения элемент объектов x и y. Возможно, вы имели в виду:

Shape::Shape(int x, int y) 
{ 
    this->x = x; 
    this->y = y; 
} 
+0

Спасибо за то, что указали эти ошибки, я изменил их, но теперь я получаю 'error: никакой конструктор соответствия для инициализации« квадрата », говорящий о квадрате sq = квадрат (2,3)' – user3223763

+1

@ user3223763 You haven 't определен какой-либо конструктор для 'Square'. – molbdnilo

+0

@ user3223763, см. Редактирование. – Shoe

2

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

bool positive(int x, y); 

Вместо должны быть

bool positive(int x, int y); 

Этот конструктор

Shape::Shape(int x, int y) 
{ 
    x = x; 
    y = y; 
} 

не инициализирует члены данных х и у. Вместо этого он просто переназначает параметры x и y. Конструктор должен быть записан либо как

Shape::Shape(int x, int y) 
{ 
    this->x = x; 
    this->y = y; 
} 

или как

Shape::Shape(int x, int y) : x(x), y(y) {} 

площади Класс должен иметь конструктор с двумя параметрами, которые он может delegeate эти параметры его конструктора базового класса. Например,

Square(int x, int y) : Shape(x, y) {} 

Также учтите, что у вас нет абстрактного класса. Абстрактный класс - это класс, имеющий чистую виртуальную функцию. Ваш класс Shape может быть абстрактным классом, если вы, например, объявить виртуальную функцию квадрат, как

virtual void area() = 0; 

Я советую вам прочитать некоторые книги на C++ для начинающих.

Смежные вопросы