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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:35:18