纯虚拟函数和继承
pure virtual functions and inheritance
我在多态性和纯虚拟函数方面遇到了问题。我的主要班级
#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 之间的强制转换
相关文章:
- 继承函数的重载解析
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 派生类调用使用非继承成员的继承函数
- 继承函数是否适用于 C++ 中的基类元素或派生类元素?
- 在链表中的某个点插入时出现问题,C++中的继承函数
- std :: is_same-来自integral_constant的继承函数的用例
- 如何将同名的继承函数视为重载函数
- 使用子函数的继承函数
- 执行覆盖的继承函数
- 相对于更专业的继承函数,模板更喜欢子类函数
- C++:继承函数并重新定义它们
- C++ 继承函数指针,可与派生方法一起使用
- 不同对象的向量,对象具有非继承函数
- C++多级继承函数调用
- 基类指向派生类继承函数调用的指针
- C++继承函数覆盖
- 派生类是否C++必须在头文件中包含继承函数/成员的定义
- 继承函数中的参数消失
- C++通过继承函数实现继承的抽象函数
- 构造函数和继承函数 c++