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

指向派生类的基类指针无法访问基类公有成员?C++代码异常排查

问题定位

你的代码输出异常是两个问题共同导致的:

  • 核心错误:仅给基类对象p的height、width赋了值,派生类对象r、t的对应成员从未初始化。每个类实例的成员变量是独立存储的,你通过指向p的指针调用setValue(),只会修改p自己的宽高,完全不会影响r和t的成员值。未初始化的int变量是栈上的随机垃圾值,计算出来的面积自然是0或随机数。
  • 语法不规范:基类的虚函数calculateArea()声明返回值为int,但函数体为空没有return语句,会触发未定义行为。
修正方案
  1. 基类polygon作为抽象基类不需要实例化,将calculateArea()改为纯虚函数,避免无返回值的问题:
    virtual int calculateArea() = 0;
    
  2. 分别给派生类对象r、t调用setValue()赋值宽高,不需要创建无实际计算意义的基类对象p。
  3. (可选规范)派生类重写虚函数时加override关键字,让编译器校验重写合法性,避免因函数签名写错导致重写失效。
修正后完整代码
#include<bits/stdc++.h>
using namespace std;

class polygon{  
    public:
        int height;
        int width;
        void setValue()
        {
            cout<<"\nEnter height and width ";
            cin>>height>>width;
        }
        // 改为纯虚函数,polygon为抽象基类
        virtual int calculateArea() = 0;
};

// 矩形派生类
class rectangle:public polygon
{
    private:
        string name;
    public:
        // 加override标记虚函数重写
        int calculateArea() override
        {
            return height*width;
        }
};

// 三角形派生类
class triangle:public polygon
{
    public:
        // 加override标记虚函数重写
        int calculateArea() override
        {
            return (height*width)/2;
        }
};

int main()
{
    rectangle r;
    triangle t;
    
    polygon* base;
    // 给矩形赋值并计算面积
    base = &r;
    base->setValue();
    cout<<"\nArea of rectangle is "<<base->calculateArea();
    
    // 给三角形赋值并计算面积
    base=&t;
    base->setValue();
    cout<<"\nArea of triangle "<<base->calculateArea(); 
    return 0;
}

如果你希望只输入一次宽高就同时给矩形、三角形使用,可以在第一次输入后把宽高值手动赋值给t.height、t.width即可,不需要重复调用输入函数。

内容的提问来源于stack exchange,提问作者Adnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:12:21