SNAKEpc12138 2022-08-30 22:04 采纳率: 100%
浏览 35
已结题

#C++#类的静态成员函数竟可调用虚函数, 如何解释?

C++静态成员函数为什么可以调用通过动态绑定的虚函数?

代码如下, 导出一个纯虚类, 父类实现如下:

//CDll1.h
#pragma once

#ifdef CDLL1_EXPORTS
#define DLL1_API __declspec(dllexport)
#else
#define DLL1_API __declspec(dllimport)
#endif 

class DLL1_API CDll1
{
public:
    static CDll1* CreateInstance();
    static void DestroyInstance(CDll1* pInstance);

    virtual void Destroy() = 0;
    virtual void DllTest() = 0;
};
//CDll1.cpp
#include "CDll1.h"
#include <Windows.h>
#include <tchar.h>

#include "Dll1.h"    //派生类

CDll1* CDll1::CreateInstance()
{
    OutputDebugString(_T("\n CDll1::CreateInstance \n"));

    return new Dll1;
}

void CDll1::DestroyInstance(CDll1* pInstance)
{
    OutputDebugString(_T("\n CDll1::DestroyInstance \n"));
    if (pInstance != NULL)
    {
        pInstance->Destroy();  //这里调用通过动态绑定的虚函数
    }
    
}

派生类实现如下:

//Dll1.h
#pragma once

#include "CDll1.h"

class Dll1 : public CDll1
{
public:
    Dll1();
    virtual ~Dll1();

    virtual void Destroy();
    virtual void DllTest();
};
//Dll1.cpp
#include "Dll1.h"
#include <windows.h>
#include <tchar.h>


Dll1::Dll1()
{
    OutputDebugString(_T("\n Dll1::Dll1 \n"));
}

Dll1::~Dll1()
{
    OutputDebugString(_T("\n Dll1::~Dll1 \n"));
}

void Dll1::Destroy()
{
    OutputDebugString(_T("\n Dll1::Destroy \n"));
    if (this != NULL)
    {
        delete this;
    }
}

void Dll1::DllTest()
{
    OutputDebugString(_T("\n Dll1::Dll1Test \n"));
}

按照之前的理解, 静态成员函数中不能引用非静态的成员, 当这里竟然可以正常通过编译, 调用结果如下:

img

还想请各位同志指教一二.

  • 写回答

2条回答 默认 最新

  • 私房菜 移动开发领域优质创作者 2022-08-31 08:49
    关注

    你好像不太理解静态成员的概念,或者不太理解对象。

    你这里的代码是静态成员函数的形参是个对象,通过对象,调用了对象的public 函数,这完全没问题。

    只要是你构造出来的对象,就可以通过对象调用public 成员。
    你上面的全局函数,也完全没有问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月3日
  • 已采纳回答 8月31日
  • 创建了问题 8月30日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助