报错“无法声明抽象类型的变量”原因排查:SHAPE抽象基类派生TRIANGLE类的实现问题
问题根源:纯虚函数重写签名不匹配!
嘿,我马上就发现问题所在了——你的TRIANGLE类其实还是个抽象类,因为你没有正确实现基类SHAPE的所有纯虚函数,所以编译器不允许你创建它的实例对象。
具体来看,基类SHAPE中定义的纯虚函数isInside是这样的:
virtual bool isInside(const POINT& other) const = 0;
它需要接收一个const POINT&类型的参数,但你在TRIANGLE类里声明的isInside函数却是无参的:
bool isInside() const;
这不属于重写(override)基类的纯虚函数,而是在派生类中定义了一个同名的重载(overload)函数。基类那个带参数的纯虚函数仍然没有被实现,所以TRIANGLE依然保持抽象类的属性,自然无法实例化。
修复步骤
- 首先,修改
TRIANGLE.h中的isInside函数签名,使其与基类完全匹配:bool isInside(const POINT& other) const; - 然后,确保你在
TRIANGLE的实现文件(比如TRIANGLE.cpp)中,完成这个带参数版本的isInside函数的具体逻辑实现。
实用小建议
从C++11开始,建议使用override关键字显式标记重写的函数,例如:
bool isInside(const POINT& other) const override;
这样一来,如果你的函数签名与基类不匹配,编译器会直接抛出错误提醒你,而不是让类默默变成抽象类,能有效避免这类签名不匹配的问题。
内容的提问来源于stack exchange,提问作者Daulet
相关产品推荐
相关产品推荐

