C++派生类FamousPainting无法覆盖基类Painting的value成员求助
问题分析与修复方案
核心错误点
FamousPainting类冗余设计:
你让FamousPainting继承Painting的同时,又在类内声明了一个Painting painting成员,属于错误的组合+继承混用。构造函数初始化的是这个内部的painting对象,而非基类本身的成员,导致基类的value始终是默认值或400,调用showPainting时自然不会显示25000。isPaintingFamous函数逻辑错误:
当前代码遍历艺术家数组时,只要有一个艺术家不匹配就将isFamous设为false,这会导致只有输入数组最后一个艺术家(Rembrandt)时才返回true,其他情况都会被后续循环覆盖为false。正确逻辑应该是找到匹配项就立即返回true,遍历完无匹配再返回false。基类构造函数赋值错误:
Painting(string name, string painter)构造函数中,name = title;是反向赋值,应该改为title = name;,否则输入的标题无法正确存入基类成员。
修复后的完整代码
#include <iostream> #include <string> #include <vector> using namespace std; class Painting { protected: string title; string artist; int value; public: Painting(); Painting(string, string); Painting(string, string, int); virtual void showPainting(); // 设为虚函数,支持多态调用(可选但推荐) void setData(); string getTitle(); string getArtist(); int getValue(); }; Painting::Painting() {} Painting::Painting(string name, string painter) { title = name; // 修复反向赋值错误 artist = painter; value = 400; } Painting::Painting(string _title, string _artist, int _value) { title = _title; artist = _artist; value = _value; } void Painting::setData() { cout << "Enter painting's title: "; cin >> title; cout << "Enter artist: "; cin >> artist; value = 400; } void Painting::showPainting() { cout << title << " done by " << artist << " cost $" << value << endl; } string Painting::getTitle() { return title; } int Painting::getValue() { return value; } string Painting::getArtist() { return artist; } class FamousPainting: public Painting { public: FamousPainting(string, string, int); }; // 直接初始化基类,而非内部冗余成员 FamousPainting::FamousPainting(string name, string painter, int val) : Painting(name, painter, val) {} bool isPaintingFamous(Painting &p) { const int NUM = 4; string artists[NUM] = {"Degas","Monet","Picasso","Rembrandt"}; for(int x = 0; x < NUM; x++) { if(p.getArtist() == artists[x]) { return true; // 找到匹配艺术家,立即返回true } } return false; // 无匹配返回false } int main() { vector<Painting> listofpainting; vector<FamousPainting> listoffpainting; for(int i = 0; i < 2; i++) { Painting temp; temp.setData(); if(isPaintingFamous(temp)) { FamousPainting tempF(temp.getTitle(), temp.getArtist(), 25000); listoffpainting.push_back(tempF); } listofpainting.push_back(temp); } cout << "普通画作列表:" << endl; for(Painting paint: listofpainting) { paint.showPainting(); } cout << "\n知名画作列表:" << endl; for(FamousPainting fpaint: listoffpainting) { fpaint.showPainting(); } return 0; }
修复后输出示例
Enter painting's title: Hime Enter artist: Mary Enter painting's title: Sophistry Enter artist: Monet 普通画作列表: Hime done by Mary cost $400 Sophistry done by Monet cost $400 知名画作列表: Sophistry done by Monet cost $25000
内容的提问来源于stack exchange,提问作者Alex Variance
相关产品推荐
相关产品推荐

