初始化而无需递归

时间:2019-03-15 15:55:18

标签: 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;
  };

也许我必须做某种类型的演员?理想情况下,我正在寻找一种不会增加开销的解决方案。

1 个答案:

答案 0 :(得分:2)

使用static_cast

在您的代码中,initialize(b)调用将无限递归,因为与{{1}相比,bB&的匹配更好(您要调用的函数的参数) ),因此重载分辨率会选择相同的函数并重复执行。

您指定要初始化A&对象的A部分。为什么不告诉编译器呢?告诉它您要像其中的b一样呼叫initialise,就像这样:

A

关于您在评论中提到的问题-在此没有副本。但是,如果我使用initialize(static_cast<A&>(b)); ,则会创建一个临时对象,但事实并非如此。我没有将static_cast<A>强制转换为类型b的对象。我将其强制转换为类型为A reference ,这将导致创建临时引用。由于AA&的匹配要好于A&,因此将选择第一个函数,从而避免了递归。