当前位置: 首页 > 知识库问答 >
问题:

C 虚拟虚空与无虚拟 [重复]

司马洲
2023-03-14

我对虚拟函数感到困惑。有人告诉我,父类中的虚拟意味着我可以在子类中覆盖它。但是,如果我省略父类中的虚拟,我仍然可以覆盖它。

#include <iostream>
using namespace std;

class Enemy{
  public:
    //if I remove virtual, it still gets overriden in child class
  virtual void attack(){ 

    cout << "Attack Enemy!" << endl;
  }
};


class Minion : public Enemy {
  public:
  void attack(){
    cout << "Attack Minon!" << endl;
  }
};
int main() {
  Minion m;
  m.attack();
}

共有3个答案

朱宏爽
2023-03-14

您没有覆盖它,您只是添加了另一个具有相同签名的方法

Enemy* enemy = new Minion();

enemy->attack();

delete enemy;

如果这调用了Minion的代码,那么您就做对了。如果它调用了敌人的代码,那么你做错了。您需要虚拟才能正确执行。

西门安歌
2023-03-14
匿名用户

您可以覆盖正在讨论的方法,最好用< code>override关键字声明该方法,以允许编译器在您没有覆盖任何内容时发出抱怨。

class Enemy {
  public:
    virtual ~Enemy() = default; /* Don't forget... or non-virtual protected. */

    virtual void attack() {}
};

class Minion : public Enemy {
  public:
    void attack() override {}
};

您的困惑可能源于这样一个事实,即您同样可以很好地隐藏基类方法。

class Enemy {
  public:
    virtual ~Enemy() = default;
    void attack() {}
};

class Minion : public Enemy {
  public:
    void attack() {}
};

这不仅做了一些不同的事情,而且是非常糟糕的命名的一个例子,因为它使读者感到困惑:在类层次结构的上下文中,具有相同签名的相同成员函数名不可避免地与重写的方法相关联。

楚俊逸
2023-03-14

如果函数是虚拟的,则在运行时通过vtable将调用动态地分派给派生类型提供的实现,而如果没有,编译器将在编译时查看对象并选择静态类型的类方法。如果您有一个指向基类的指针,这意味着如果函数不是虚拟的,则使用基实现:

敌人 *e = 新小黄人(); e-

将打印“攻击敌人!”如果攻击不是虚拟的。当使用虚拟函数时,编译器将插入一些逻辑以在运行时查找正确的实现,当<code>e-

如果要强制派生类重写基类方法,还可以使用

虚拟无效攻击()=0;

 类似资料:
  • 不能将“virtualenv”识别为内部或外部命令、可操作程序或批处理文件。 我正在遵循的步骤 在默认目录下安装-pip安装virtualenv 要创建一个venv,请运行此virtualenv-p python3 venv 激活virtualenv\Scripts\Activate 它看起来像这样(venv)

  • 虚拟化 [PV_OPS] noreplace-paravirt 禁止使用内核通用的半虚拟化接口paravirt_ops,主要用于解决某些在Virtual PC上安装或运行Linux的故障。 [VMMIO] virtio_mmio.device=size@baseaddr:irq[:id] 实例化virtio-mmio设备(CONFIG_VIRTIO_MMIO)。可以多次使用以实例化多个设备。 si

  • 查看虚拟机相关的监控告警信息。 监控菜单下的虚拟机页面主要用于查看虚拟机相关的监控告警信息。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “监控/资源/虚拟机” 菜单项,进入虚拟机页面。 查看虚拟机列表 该功能用于查看虚拟机的监控告信息。 在虚拟机页面,支持查看以下信息: 名称:虚拟机的名称。 IP:虚拟机的IP地址。 监控状态:虚拟机是否设置告警以及发生告警。 状态:虚拟机的当

  • 主机回收站用于存放用户删除的虚拟机和裸金属文件。 主机回收站用于存放用户删除的虚拟机和裸金属文件。回收站中主机文件默认保存3天,如有误删除的主机需要在3天内进行恢复操作,可以将其恢复到原来位置,超过3天后,文件将被彻底删除。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “主机/回收站/主机” 菜单项,进入主机回收站列表。 清除 当确定回收站中的主机无用后,可使用清除功能立即彻底删

  • 虚拟机是采用虚拟化技术构建的运行在宿主机上的虚拟机实例。 虚拟机是采用虚拟化技术构建的运行在宿主机上的虚拟机实例,包括CPU、内存、操作系统、硬盘、网卡等完整的虚拟硬件基础环境。 虚拟机来源: 当云管平台对接其他平台云账号后,将会自动同步其他平台上的虚拟机到云管平台上进行管理。 新建虚拟机。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “主机/主机/虚拟机” 菜单项,进入虚拟机页

  •  TJS2 は、スクリプトをいったん仮想マシン (TJS2 VM) 用のバイナリコードにコンパイルしてから実行します。  例外が発生したときやダンプを行ったときにこの TJS2 VM のコードの逆アセンブル結果が表示されるので、この仮想マシンについて簡単に説明します。 命令コード  TJS2 VM は関数やプロパティなどの実行単位ごとに独立していて、ある一つの関数が他の関数と命令コード空間、レジス