c++ - 在 C++ 的基类构造函数中构造派生类

标签 c++ oop polymorphism

<分区>

假设我有一个从基类派生的类。多态性允许我通过指向基类的指针调用派生类的函数(使用虚函数)。换句话说,我可以让派生类的成员“假装”为基类的成员。请记住,基类是否有可能在其构造函数中实际构造派生类的成员(然后派生类“假装”为基类的成员,因此没有任何问题)?从逻辑上讲,我看不出有什么理由说这不起作用,但我无法弄清楚如何在语法上做到这一点。如果这是不可能的,为什么不呢?

我知道我可以有一个单独的函数来构造派生类的成员并将其作为基类的成员返回。如果这最终无法实现,我将这样做,但将它作为构造函数会更清晰(因为这就是这个单独的函数的基本含义)。

编辑:这是我正在寻找的示例:

class base
{
  base()
  {
    this=new derived(); //This is what I am looking for
  }

  virtual func();
};

class derived : public base
{
  derived() : base()
    {}

  func()
  {
    ...
  }
};

如上所述,这可以通过以下方式实现:

base *fake_base_constructor()
{
  return new derived();
}

在实践中,会有多个派生类,基类构造函数会根据参数在派生类中进行选择,但从概念上讲,你只需要一个。

最佳答案

听起来你想要 curiously recurring template pattern .它允许基类通过给它一个派生类型的模板参数来知道从它派生的类型:

template <class D>
class Base
{ };

class Derived : public Base<Derived>
{ };

现在您可以在 Base 的定义中使用模板参数 Derived。例如,Base 的构造函数可以做:

template <class D>
void Base<D>::some_base_member()
{
  D d;
};

事实上,这种模式的一个重要结果是您可以从 Base 类中调用一个 Derived 成员。例如:

template <class D>
void Base<D>::some_base_member()
{
  static_cast<D*>(this)->some_derived_member();
};

关于c++ - 在 C++ 的基类构造函数中构造派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13998869/

相关文章:

Haskell 多态解构

c++ - 使用模函数通过乘法实现幂

c++ - 使用输入执行程序的 Shell 脚本

perl - Moose 角色中的方法名称冲突

Python:与 OOP 中的类、属性和方法混淆

javascript - 如何从替换的实现中调用类中的方法?

ruby-on-rails-3 - 设计 Invitable Rails Admin 冲突

c++ - boost序列化多态类

c++ - 将 std::map 移植到 C?

c++ - 引用包装器的初始化列表