我是一个C新手,我刚开始学习类继承。我以前有一点C的指针和变量的经验,但不记得太多。
这就是我的问题。
所以我有两个类,一个基类和一个派生类
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() {
int tmp = 5;
SetValue(&tmp);
}
};
#endif
Derived.h
#ifndef DERIVED_H
#define DERIVED_H
#include "Base.h"
class Derived : public Base {
public:
Derived() { Base(); }
};
#endif
main.cpp
#include <iostream>
#include "base.h"
#include "derived.h"
int main() {
Derived derived = new Derived();
std::cout << derived->GetValue() << std::endl;
return 0;
}
控制台输出
0
我做错了什么?控制台输出应该是5
,对吗?
3条答案
按热度按时间1l5u6lss1#
你的问题是你在不需要指针的时候使用了指针,最重要的是你使用的指针不正确。特别是,您将
value_
设置为指向tmp
,但tmp
是一个局部变量,一旦Base()
构造函数返回,它就会被销毁,因此value_
将成为一个悬空指针,当您稍后尝试通过GetValue()
访问它时,您将调用未定义的行为。您应该在代码中的任何地方将
int*
更改为int
,并且也不要使用new
运算符(在本例中不需要它,使用它会导致程序泄漏内存)。ryevplcw2#
要从子构造函数调用父构造函数,需要在初始化器列表中完成。例如:
所以你的子类应该是这样的:
uplii1fm3#
你的继承没有什么真正的问题,基本上是你的赋值中的一个错误
base.h
derived.h
然后打电话说