c++ - 无递归初始化

标签 c++ c inheritance recursion struct

我正在尝试进行一些重构,我很好奇您将如何解决这个问题。

基本上我试图为每个类创建一个初始化函数。有些类是从其他类继承的,如果可能的话,我想使用父初始化函数。您将如何解决这个问题?

我想将这些结构与memcpy一起使用也许也将它们与关键字 align 一起使用和__attribute__((packed)) ;并且它们必须可与 extern "C" 一起使用。我会排除构造函数和析构函数。

举例说明:

struct A
  {
  int a;
  };

void initialize(A& a)  
  {
  a = 0;
  }

struct B : A
  {
  int b;
 };

void initialize(B& b)
  {
  initialize(b); // here I want void initialize(A& a), not recursion
  b = 0;
  };

也许我必须做一些类型转换?理想情况下,我正在寻找一种不会产生开销的解决方案。

最佳答案

使用 static_cast .

在您的代码中,initialize(b)调用将无限递归,因为 b更好地匹配为 B&A& (您要调用的函数的参数),因此重载决议选择相同的函数并重复。

您指定要初始化 A b的一部分目的。为什么不告诉编译器呢?告诉它你想打电话 initialise就好像它是一个 A ,像这样:

initialize(static_cast<A&>(b));

至于您在评论中提到的担忧 - 这里没有复制。如果我使用static_cast<A>但是,会创建一个临时对象,但事实并非如此。我不类型转换b类型为 A 的对象。我将其转换为 A 类型的引用 ,这将导致创建临时引用。自 A&A& 匹配比 B& 更好,将选择第一个函数,从而避免递归。

关于c++ - 无递归初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55186370/

相关文章:

c++ - 在 C++ 程序中使用 C 共享库

c++ - 这是多重继承的好用法吗?

c++ - 使用 AudioFileServices 在 iOS 6 中进行颗粒合成

c++ - 为什么编译器在我的 set_intersection 上给我一个错误?

c - 指针/结构体 (C) - IDE : Eclipse

android - Kotlin 从嵌套类引用外部类

java - 检查当前类的实例时,为什么 "x instanceof getClass()"不起作用?

c++ - 使用 gcc 4.9 在 snow leopard 的 qt creator 中设置 c++11

c++ - 重载解析如何在 private 修饰符的上下文中工作?

c - c中的帕斯卡三角形与gmp