C 类构建和运行,而无需调用父构建器
C++ class building and running without calling parent constructor
我发现了一个奇怪的情况,我无法解释。我有父母课程和基础课。在父类的构造函数中,我定义了一个本地对象(这是一个复杂的C设备 - 想想XML解析器和处理器)。然后我创建了一个子类,但是在子类构造函数中,我完全忘了打电话给父构建器。结果是该程序运行,所有情况看起来都很好。孩子课程打电话给所有父级操作,一切似乎都起作用...直到程序崩溃(在内核层面谈论恐慌)。我不确定这是否是坠机的原因,但可能是。
我之所以追求的是试图了解它的工作原理(也许直到一点)。我是如此疯狂地幸运,以至于记忆在本地对象方面排队了吗?
看一下简化的定义,以了解我的意思
// header
class ParentClass
{
private:
OtherClass _complexObject;
protected:
public:
ParentClass();
virtual ~ParentClass();
virtual void AddData(OtherClass *complexObject);
virtual void DoStuff();
}
class ChildClass: public ParentClass
{
private:
protected:
public:
ChildClass();
virtual ~ChildClass();
}
//source
ParentClass::ParentClass()
{
_complexObject = create_complex_object();
}
ParentClass::~ParentClass(){}
void ParentClass::AddData(OtherClass *complexObject)
{
add_data_to_object(complexObject, 12345);
}
void ParentClass::DoStuff()
{
AddData(_complexObject);
}
BaseClass::BaseClass(){}
BaseClass::~BaseClass(){}
// at some point, BaseClass::DoStuff() is called...
然后我创建了一个子类,但是在子类构造函数中,我完全忘记了称为父构建器。
此作用和编译的原因是因为C 语言可确保层次结构中的对象被初始化。在这种情况下,编译器会发现您的派生(您的术语中的"孩子")不会称呼基础的("父")构造函数...因此编译器为您做。现在,只有当基类具有可访问的默认构造函数(不采用参数的构造函数)时,才能执行此操作,在这里也是如此。
如果您的基类没有默认的构造函数(也就是说,它只有需要参数的构造函数),则编译器不知道该做什么,这是编译错误。
如果"复杂对象"具有默认的构造函数,无论如何都会初始化。也许您正在使用基本上具有"垃圾"的变量,这会导致您出现问题。
相关文章:
- 如何在 go 中调用带有 .lib 和.dll文件的预构建 API
- 如果初始化需要shared_from_this,如何在一次调用中构建一个类
- 在构建过程中捕获所有编译器调用和命令行参数
- 构建 castalia 时出错:重载函数的调用不明确
- 除非在 target_link_directories() 命令上调用 pthread,否则 CMake 构建将失败
- CMake in CLion,调用远程构建而不是本地构建
- NDK - 包含一个预构建的库,并在 Android 项目中调用本机函数
- Cmake,Android:调用在预构建库中定义的静态函数
- Libace相关的clang构建错误`提供的参数很少为功能型宏调用`
- 我无法获得由 Clang 构建的优化 NDK 应用程序的调用堆栈
- 如何链接和调用安卓工作室预构建静态原生库的函数
- 调用从.NET Core中的C++项目构建的.dll时出现BadImageFormatException
- 使用 bazel 构建 TensorFlow C++调用模型时,.so 文件不起作用
- 如何获取链表中的所有"next"节点?构建调用字符串不起作用
- C 类构建和运行,而无需调用父构建器
- 如何从可从C++代码调用的 Ada 源代码构建静态库?
- 无法弄清楚如何在C 中调用父构建器
- 用C++为java构建一个dll,它正在调用另一个dll(Eclipse上的JNI)
- 在c#中构建一个int数组,每个int调用c++或在c++中构建并传递给c#
- C++从函数调用的多个返回中构建字符串向量的最佳方法