Я новичок в наследовании, и у меня возникают проблемы с пониманием некоторых его концепций.C++ Beginner Inheritance Issue
Что я пытаюсь сделать, так это класс Rectangle
, который создает и рисует прямоугольник. У меня есть другой класс под названием Button
, который представляет собой прямоугольник с текстом на нем и изменяет цвет в зависимости от того, нажата ли кнопка или нет.
Мой класс Rectangle используется в других областях и работает. Я не уверен, как получить класс Button
для наследования класса Rectangle
так, как я его хочу.
Rectangle.h
#ifndef _rectangle_h_
#define _rectangle_h_
#include <vector>
#include "glut.h"
class Rectangle
{
public:
Rectangle(std::vector<int> p1, std::vector<int> p2, double color[3]);
void Draw() const;
protected:
std::vector<int> mP1;
std::vector<int> mP2;
double mColor[3];
};
#endif
Rectangle.cpp
#include "Rectangle.h"
Rectangle::Rectangle(std::vector<int> p1, std::vector<int> p2, double color[3])
{
mP1 = p1;
mP2 = p2;
mColor[0] = color[0];
mColor[1] = color[1];
mColor[2] = color[2];
}
void Rectangle::Draw() const
{
glColor3d(mColor[0], mColor[1], mColor[2]);
glBegin(GL_QUADS);
glVertex2d(mP1[0], mP1[1]);
glVertex2d(mP2[0], mP1[1]);
glVertex2d(mP2[0], mP2[1]);
glVertex2d(mP1[0], mP2[1]);
glEnd();
}
Вот что я пытаюсь сделать, но я не уверен, что правильный синтаксис будет. Button
способен использовать очки Rectangle
(mP1 and mP2
) и цвет (mColor
). Button
не может наследовать Rectangle
метод Draw
, потому что Button
также должен нарисовать текст, но для того, чтобы нарисовать реальный прямоугольник, необходимо вызвать метод .
Мой вопрос: «Как мне это сделать?»
Опять же, как я думаю, правильный метод реализации этого будет, но я знаю, что это неверно, и я спрашиваю, каким будет правильный способ сделать это.
button.h
#ifndef _button_h_
#define _button_h_
#include <vector>
#include <string>
#include "Rectangle.h"
class Button: public Rectangle
{
public:
Button(std::vector<int> p1, std::vector<int> p2, std::string text);
void Press();
void Release();
void Draw() const;
private:
bool mPressed;
std::string mText;
};
#endif
Button.cpp
#include "Button.h"
#include <iostream>
Button::Button(std::vector<int> p1, std::vector<int> p2, std::string text)
{
double color[3] = {.19,.75,1};
Rectangle(p1,p2,color);
mText = text;
}
void Button::Press()
{
mPressed = true;
mColor[0] = .19;
mColor[1] = .34;
mColor[2] = 1;
}
void Button::Release()
{
mPressed = false;
mColor[0] = .19;
mColor[1] = .75;
mColor[2] = 1;
}
void Button::Draw() const
{
Rectangle::Draw();
// I will worry about drawing the actual text later
// for now I just want to make sure that I can print the text
std::cout << mText << std::endl;
}
Возможно, вы должны перефразировать. Здесь нет актуального вопроса. – dingalapadum
Спасибо, я исправил это. – tysonsmiths
сделать 'Rectangle :: Draw' виртуальным (и переопределить его)? – Kevin