抽象类和继承 C++

Posted

技术标签:

【中文标题】抽象类和继承 C++【英文标题】:Abstract classes and inheritence C++ 【发布时间】:2015-02-05 08:51:26 【问题描述】:

我有一个让我很困惑的问题。现在,我有一个抽象的 GameObject 类和一个继承自 GameObject 类的 Sprite2D 类。

但是,我发现,当我尝试实现未在 GameObject 类中定义的附加功能时,链接器会抛出 LNK2001: Unresolved External Symbol 错误。但是,当我在 GameObject 中声明新函数的纯虚拟定义时,它们就消失了。

这是为什么呢?是否有任何有用的资源可以让我更好地理解抽象类和继承之间的关系?谢谢!

附:对于那些感兴趣的人,我的 GameObject 和 Sprite2D 标头如下。

GameObject.h:

#ifndef GAMEOBJECT_H
#define GAMEOBJECT_H

class GameObject

private:
    class Concept
    
    public:
        virtual void Update() = 0;
        virtual void Draw() = 0;
    ;

    template <typename T>
    class Model : public Concept
    
    public:
        Model(T base) : newObj(base)
        

        

        void Update()
        
            newObj.Update();
        

        void Draw()
        
            newObj.Draw();
        

    private:
        T newObj;
    ;

    Concept *pC;

public:
    template <typename T>
    GameObject(T newObj) : pC(new Model <T>(newObj))
    

    

    void Update()
    
        pC->Update();
    

    void Draw()
    
        pC->Draw();
    
;

#endif

Sprite2D.h:

#ifndef SPRITE2D_H
#define SPRITE2D_H

#include "GameObject.h"

#include "AEEngine.h"
#include <string>

class Sprite2D : public GameObject

protected:
    std::string name;
    AEVec2 position, scale, direction, velocity, acceleration;
    f32 rotation 0.0f ;
    AEGfxVertexList * pMesh nullptr ;
    AEGfxTexture * pTex nullptr ;
    struct AABB AEVec2 min; AEVec2 max;  boundingBox;
    bool isAlive;

    void CreateMesh(AEVec2, AEVec2, u8, u8, u8, u8);
    void CreateMesh(AEVec2, AEVec2, const char *);

public:
    //Constructors
    Sprite2D();
    Sprite2D(const char *name, f32 xPos, f32 yPos, f32 xSize, f32 ySize, u8 alpha, u8 red, u8 green, u8 blue);
    Sprite2D(const char *name, f32 xPos, f32 yPos, f32 xSize, f32 ySize, const char *texPath);
    //Destructor
    ~Sprite2D();

    virtual void Update();
    virtual void Draw();

    void SetAlive(bool);
    bool IsAlive();

    void SetName(std::string);
    std::string GetName();

    void SetPosition(AEVec2);
    AEVec2 GetPosition();

    void SetScale(AEVec2);
    AEVec2 GetScale();

    void SetDirection(AEVec2);
    AEVec2 GetDirection();

    void SetRotation(f32);
    f32 GetRotation();

    void SetVelocity(AEVec2);
    AEVec2 GetVelocity();

    void SetAcceleration(AEVec2);
    AEVec2 GetAcceleration();

    void SetBoundingBox(f32 sizeX, f32 sizeY);
    AABB GetBoundingBox();
;

#endif

【问题讨论】:

您只是在Sprite2D 类中添加成员函数声明,还是同时添加这些函数的实际实现?如果添加实现,是否将它们添加到与项目的其余部分一起构建的文件中? 【参考方案1】:

确保您实际实现了这些方法,并且实现它们的文件包含在您正在构建的目标中

【讨论】:

是的,我确实在另一个 .cpp 文件中实现了这些功能,并确保包含适当的头文件。为了简洁起见,我只是决定不在这里发布它们。

以上是关于抽象类和继承 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++:抽象基类和纯虚函数的理解

关于类抽象类和接口的继承关系

抽象类和接口区别

抽象类和接口学习小结

java 抽象类和接口的区别

java 抽象类和接口