C++派生类无法访问基类构造初始化成员的问题求助
问题分析与修正
你的代码存在三个关键错误,直接导致输出不符合预期:
1. 基类构造函数使用局部变量地址,产生野指针
Base构造函数中的int tmp = 5;是栈上的局部变量,构造函数执行完毕后,该变量会被销毁,对应的内存地址会被系统回收。你把&tmp赋值给value_,此时value_就成了野指针——指向的内存已不属于当前程序,后续访问行为完全未定义,可能输出随机值(比如你看到的0),甚至引发程序崩溃。
2. 派生类构造函数错误调用基类构造
Derived构造函数里的Base();并不是初始化当前Derived对象的基类部分,而是创建了一个临时Base对象,这个临时对象创建后立刻被销毁,对当前Derived的基类成员没有任何影响。实际上,派生类对象创建时,基类的默认构造函数会自动触发,完全不需要手动调用Base();。
3. main函数中对象声明类型不匹配
Derived derived = new Derived();是错误写法:new Derived()返回Derived*类型的指针,但你把它赋值给Derived类型的对象,这在C++中不允许(除非有对应转换构造,而你这里没有)。正确写法应为Derived* derived = new Derived();,或者直接创建栈对象Derived derived;。
修正后的代码
Base.h
#ifndef BASE_H #define BASE_H class Base { protected: int* value_; public: int* GetValue() { return value_; } void SetValue(int* value) { value_ = value; } Base() { // 改用堆内存分配,避免局部变量销毁导致野指针 value_ = new int(5); } // 添加析构函数释放堆内存,防止内存泄漏 ~Base() { delete value_; } }; #endif
Derived.h
#ifndef DERIVED_H #define DERIVED_H #include "Base.h" class Derived : public Base { public: // 基类默认构造会自动调用,无需手动实现 Derived() = default; }; #endif
main.cpp
#include <iostream> #include "Base.h" #include "Derived.h" int main() { // 方式1:使用堆指针 Derived* derived = new Derived(); // 注意:要输出指针指向的数值,需要加*解引用 std::cout << *derived->GetValue() << std::endl; delete derived; // 手动释放堆对象 // 方式2:创建栈对象(更推荐,无需手动释放内存) Derived derived2; std::cout << *derived2.GetValue() << std::endl; return 0; }
额外补充:
- 你原代码中
cout << derived->GetValue()输出的是指针的内存地址,而非指针指向的数值,必须加*解引用才能得到预期的5。 - 如果不是必须使用指针,更推荐直接用
int value_;替代指针成员,这样能彻底避免野指针、内存泄漏等问题,代码也更简洁安全。
内容的提问来源于stack exchange,提问作者GalaxyGamingBoy
相关产品推荐
相关产品推荐

