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
相关产品推荐
相关产品推荐

