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

C++派生类FamousPainting无法覆盖基类Painting的value成员求助

问题分析与修复方案

核心错误点

  1. FamousPainting类冗余设计:
    你让FamousPainting继承Painting的同时,又在类内声明了一个Painting painting成员,属于错误的组合+继承混用。构造函数初始化的是这个内部的painting对象,而非基类本身的成员,导致基类的value始终是默认值或400,调用showPainting时自然不会显示25000。

  2. isPaintingFamous函数逻辑错误:
    当前代码遍历艺术家数组时,只要有一个艺术家不匹配就将isFamous设为false,这会导致只有输入数组最后一个艺术家(Rembrandt)时才返回true,其他情况都会被后续循环覆盖为false。正确逻辑应该是找到匹配项就立即返回true,遍历完无匹配再返回false。

  3. 基类构造函数赋值错误:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:15:38