纯虚拟函数和继承

pure virtual functions and inheritance

本文关键字:继承 函数 虚拟      更新时间:2023-10-16

我在多态性和纯虚拟函数方面遇到了问题。我的主要班级

#include<memory>
class Shape
{
  public:
  Gdiplus::Point start; 
  Gdiplus::Point end;
  std::shared_ptr<Gdiplus::Pen> m_pen;
  virtual void Draw(Gdiplus::Graphics & m_GraphicsImage) = 0;

  void setPen(std::shared_ptr<Gdiplus::Pen> pen2);

  void setStart(int xPos, int yPos);
  void setEnd(int xCor, int yCor);
};

然后我有一个派生自Shape的类。第h行

 #pragma once

 #include<memory>
class Line: public Shape
{
public:
  void Draw(Gdiplus::Graphics & m_GraphicsImage);
}

这是我的线路

#include "stdafx.h"
#include "Line.h"
#include "ShapeMaker.h"

void Line::Draw(Gdiplus::Graphics & m_GraphicsImage)
{
  m_GraphicsImage.DrawLine(m_pen.get(),start.X,start.Y,end.X,end.Y);
}

在我的main上,由于多态性原因,我声明了一个Shape类型的共享指针

 std::shared_ptr<Shape> m_shape;

然后尝试调用Line.cpp的函数,但它不起作用,

LRESULT CDrawView::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
int xPos= GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
start.X = xPos;
start.Y = yPos;

//Line line;
auto line = std::make_shared<Shape> (m_shape);
std::shared_ptr<Gdiplus::Pen> myPen(pen.Clone());
line->setPen(myPen);
line->setStart(xPos,yPos);
return 0;
}
LRESULT CDrawView::OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
int xPos= GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
end.X = xPos;
end.Y = yPos;
//Pen pen(Color(0, 0, 255));
//Line line;
auto line = std::make_shared<Shape> (m_shape);
line->setEnd(xPos,yPos);
line->Draw(m_GraphicsImage);
m_shape.reset();

RedrawWindow();

return 0;

}现在我得到drawview.cpp(54(:错误C2371:"line":重新定义;不同的基本类型1> \draw\drawview.cpp(53(:请参见"行"的声明

我认为问题出在你的构造函数上

std::make_shared<Shape> (m_shape);

它本质上是新的Shape(一个抽象类(。相反,你应该使用

std::make_shared<Line> (m_shape);

void Draw(Gdiplus::Graphics & m_GraphicsImage)

应读取

void Line::Draw(Gdiplus::Graphics & m_GraphicsImage)

如果没有Line::,您将定义一个名为Draw()的自由函数,该函数恰好与Line::Draw()具有相同的签名,但在其他方面与之无关

错误是实例化Shape,这是一个抽象类。

上面的语法"auto-line=std::make_shared(m_shape(;"是罪魁祸首。

在本语句中,您正试图实例化Shape类。

请参阅http://www.cplusplus.com/reference/memory/dynamic_pointer_cast/

以正确使用shared_ptr 之间的强制转换