【问题标题】:C++ Access a Base Class's virtual function through a derived objectC++ 通过派生对象访问基类的虚函数
【发布时间】:2014-04-11 10:22:26
【问题描述】:

我正在尝试为我的 Adv 创建一个基于文本的 RPG。编程课程,我对多态性有点不确定。我正在分段构建它,目前我正在尝试基于先前的分配来获得视觉显示,该分配涉及通过坐标将彩色字符绘制到控制台以创建地图。所以我有这个主要的:

#include "Map.h"


using namespace std;

int main()
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

    ColorMap* _map = new ColorMap(handle, "north");

}

我想指向基类的函数populateMap,然后访问派生类的populateMap。这是供参考的标题

#pragma once

#include <Windows.h>
#include <string>

using namespace std;

class Map
{
public:
    Map(HANDLE handle, string direction);
    ~Map(){};

    virtual void update();
    virtual void populateMap();

    void drawPoint(int x, int y) const;

protected:
    HANDLE mHandle;
    char mMap[15][15];
    char mWall;
    char mSpace;
    string mIncomingDirection;
};

class ColorMap : public Map
{
public:
    ColorMap(HANDLE handle, string direction);
    ~ColorMap(){};

    virtual void update();
    virtual void populateMap(); 

    void drawMap();

private:
    int mColor;
};

【问题讨论】:

  • 你的问题是什么?
  • _map-&gt;populateMap()
  • 您的基类缺少虚拟析构函数。

标签: c++ function polymorphism virtual


【解决方案1】:

不清楚在哪里你想访问基类的方法,但你可以这样做:

_map->Map::populateMap(); // calls base class member function
_map->populateMap();      // calls derived class member function

【讨论】:

  • 只是想知道......你真的用过_map-&gt;Map::populateMap();这样的东西吗?
  • @Sambuca 我有,但我自己从未使用过。我会说这是代码气味的标志。
【解决方案2】:

如果您需要 ColorMap 实现来扩展基本实现:您的 ColorMap 的 populateMap() 实现应该去:

void ColorMap::populateMap() {
    Map::populateMap(); // first call the base class
    // now do your things...
}

如果你有

Map *m=new ColorMap(...);

m->populateMap();

这将调用派生类方法....但是,您仍然可以在该方法中访问该方法的父类版本并运行它(之前、之后或中间)其余代码。

【讨论】:

  • 如果要动态创建派生对象,ColorMap 还必须有一个虚拟析构函数。
  • 为什么是 Map 然后是 ColorMap 而不是 ColorMap *m=new ColorMap,就像我有的一样?
  • @user3523222 我想强调的是,你可以通过基类的指针来调用子类方法。
【解决方案3】:

让您的 Colormap 构造函数将参数传递给基本构造函数。 一旦在基类中声明了virtual,派生类就不需要再声明virtual了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2015-05-23
    • 1970-01-01
    • 2023-03-14
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多