关于下面代码,说法错误的是( )。
class Shape {
protected:
string name;
public:
Shape(const string& n) : name(n) {}
virtual double area() const {
return 0.0;
}
};
class Circle : public Shape {
private:
double radius;
public:
Circle(const string& n, double r) : Shape(n), radius(r) {}
double area() const override {
return 3.14159 * radius * radius;
}
};
class Rectangle : public Shape {
private:
double width; // 宽度
double height; // 高度
public:
Rectangle(const string& n, double w, double h) : Shape(n), width(w), height(h) {}
double area() const override {
return width * height;
}
};
int main() {
Circle circle("MyCircle", 5.0);
Rectangle rectangle("MyRectangle", 4.0, 6.0);
Shape* shapePtr = &circle;
cout << "Area: " << shapePtr->area() << endl;
shapePtr = &rectangle;
cout << "Area: " << shapePtr->area() << endl;
return 0;
}逐项分析每个选项,利用C++语法规则和算法知识判断正误。注意隐含条件(如整型溢出、栈溢出)。
注意题目问的是"错误的是"还是"正确的是",避免看反。选项中若有绝对化表述通常错误。
【考点】C++继承体系|虚函数重写|多态指针
🎯 考纲定位:C++ 面向对象的继承与多态(六级)核心考点。命题人精准卡住“基类指针可指向任意派生类对象”这一关键概念,多数考生误以为指针类型必须完全一致,却忘了继承体系下类型兼容的本质,此题专挖多态实现层面的理解盲区。
🧠 解题思维:识别基类指针指向派生类对象是合法操作,核心在于基类指针类型与派生类对象类型兼容。通法:遇到指针赋值题,先看基类指针定义,再看派生类对象定义,若派生类继承自基类则赋值合法,无需强转。
🪤 陷阱拆解:A选项是典型“指针类型陷阱”,命题人利用“基类指针只能指向基类对象”的误解,实则基类指针可指向任意派生类。B、C、D均为正确陈述,A是唯一错误项。若只背“指针类型必须一致”,就会误判A正确,此题专挖“多态指针”概念盲区。此外D选项提到"override"关键字,若缺失则不会报错但失去编译期检查,命题人用此细节区分真正理解多态与仅会调用。
🔄 反命题思维:若将指针改为Circle*或Rectangle*,赋值会报错;若去掉基类virtual,多态失效。遇到此类题先自问“改指针类型会怎样?”“去掉virtual会怎样?”,方能避开命题人预设的陷阱。