纯虚函数和继承

时间:2013-03-27 16:33:44

标签: c++ polymorphism abstract-class pure-virtual

我遇到了多态和纯虚函数的问题。我的主要课程

#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的类。 Line.h

 #pragma once


 #include<memory>

class Line: public Shape
{
public:
  void Draw(Gdiplus::Graphics & m_GraphicsImage);
}

这是我的line.cpp。

#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);
}

在我的主要部分,我声明了一个类型为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 GT; \ draw \ drawview.cpp(53):参见'line'的声明

3 个答案:

答案 0 :(得分:2)

我认为问题是你的构造函数

std::make_shared<Shape> (m_shape);

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

std::make_shared<Line> (m_shape);

答案 1 :(得分:0)

该行

void Draw(Gdiplus::Graphics & m_GraphicsImage)

应该阅读

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

如果没有Line::,您定义的名为Draw()的免费函数恰好与Line::Draw()具有相同的签名,但与其无关。

答案 2 :(得分:0)

错误用于实例化Shape,它是抽象类。

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

在此语句中,您尝试实例化Shape类。

参考这个 http://www.cplusplus.com/reference/memory/dynamic_pointer_cast/

在shared_ptr

之间正确使用强制转换