指向派生类的基类指针无法访问基类公有成员?C++代码异常排查
问题定位
你的代码输出异常是两个问题共同导致的:
- 核心错误:仅给基类对象
p的height、width赋了值,派生类对象r、t的对应成员从未初始化。每个类实例的成员变量是独立存储的,你通过指向p的指针调用setValue(),只会修改p自己的宽高,完全不会影响r和t的成员值。未初始化的int变量是栈上的随机垃圾值,计算出来的面积自然是0或随机数。 - 语法不规范:基类的虚函数
calculateArea()声明返回值为int,但函数体为空没有return语句,会触发未定义行为。
修正方案
- 基类
polygon作为抽象基类不需要实例化,将calculateArea()改为纯虚函数,避免无返回值的问题:virtual int calculateArea() = 0; - 分别给派生类对象
r、t调用setValue()赋值宽高,不需要创建无实际计算意义的基类对象p。 - (可选规范)派生类重写虚函数时加
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
相关产品推荐
相关产品推荐

