You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++编译错误:非标准语法需用'&'创建成员指针及虚函数参数问题

解决你的C++虚函数重写与编译错误问题

咱们先拆解你遇到的两个核心问题:

1. 编译错误的直接原因:输出语句错误引用成员函数

你在cout里写的attack是类的成员函数名,编译器会把它解析成成员函数指针,直接输出指针就会触发那个"non-standard syntax"错误。你实际想输出的应该是传入的攻击数值(也就是基类虚函数要求的int参数),所以得把参数名写进去,而不是函数名。

2. 虚函数重写不匹配的问题

基类Enemy的虚函数签名是virtual void attack(int ),但你的派生类tank和monster里的attack()是无参函数——这不是重写基类的虚函数,而是在派生类里定义了一个新的同名函数,把基类的函数隐藏了。当你用基类指针调用attack(30)时,实际调用的是基类的空实现,而且派生类的无参函数根本不会被触发,还会导致后续的参数不匹配问题。

修正后的完整代码

#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;

class Enemy {
protected:
public :
    // 给参数加上名字,方便派生类使用
    virtual void attack(int damage) { }
};

class tank : public Enemy {
public:
    // 使用override关键字强制检查重写是否正确,避免签名不匹配
    void attack(int damage) override {
        cout << "attack from tank - " << damage << endl;
    }
};

class monster : public Enemy {
public:
    void attack(int damage) override {
        cout << "attack from mob - " << damage << endl;
    };
};

int main() {
    tank tnk;
    monster mob;
    Enemy *enemy1= &tnk;
    Enemy *enemy2 = &mob;
    enemy1->attack(30);
    enemy2->attack(30);
};

关键修正点说明

  • 匹配虚函数签名:派生类的attack函数必须和基类保持完全一致的参数列表(这里就是带一个int参数)。
  • 使用override关键字:这是C++11及以后的特性,能让编译器帮你检查是否正确重写了基类的虚函数,如果签名不匹配会直接报错,避免隐性的逻辑错误。
  • 修正输出内容:把cout里的attack改成传入的damage参数,这样才会输出你传入的30这个攻击值。

这样编译就能通过,运行后会输出:

attack from tank - 30
attack from mob - 30

内容的提问来源于stack exchange,提问作者Edric Jun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:40:56