C++11构造函数继承和纯虚方法

标签 c++ design-patterns inheritance c++11 constructor

注意:不是 C++ 11 Delegated Constructor Pure Virtual Method & Function Calls -- Dangers? 的拷贝.这个其他问题指的是一个概念上类似的问题,但实际上并没有为这种情况提供解决方案。

考虑以下程序:

#include <iostream>
using std::cout;
using std::endl;

class Base {
    virtual void init() = 0; // a hook function
  public:
    Base(int a, int b) { /* ... */  init(); }
    Base(char a, int b) { /* ... */  init(); }
    Base(char a, int b, double* c) { /* ... */  init(); }
    /* etc.  Dozens of constructors */
};    

class Derived1 : public Base {    
    void init() { cout << "In Derived1::init()" << endl; }    
  public:    
    using Base::Base;    
};      

class Derived2 : public Base {    
    void init() { cout << "In Derived2::init()" << endl; }    
  public:    
    using Base::Base;    
};    

int main() {
  Derived1 d1(1, 2);
  Derived2 d2('a', 3);
  return 0;
}

此代码显然无法运行(尽管它在某些编译器上编译时会出现警告)。问题是,实现这种模式的最佳方式是什么?假设 Base 中有几十个派生类和几十个构造函数,在派生类中重新实现 Base 构造函数(在派生构造函数的主体中调用基类构造函数和 init() )并不是很理想。

最佳答案

该代码需要进入派生类构造函数,直到对象具有派生类型才能运行。

但是您可以使用完美转发一次将它添加到所有构造函数:

class Derived1 : public Base
{
public:
    template<typename... T>
    explicit Derived1(T&&... t) : Base(std::forward<T>(t)...) {
      std::cout << "Derived1::init logic goes here" << endl;
    }
};

关于C++11构造函数继承和纯虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21120612/

相关文章:

javascript - 实现生成文本/html 格式输出的函数的优雅方法是什么?

design-patterns - 无法结合 Factory/DI

java - 将 HashMap 与子类一起使用

c++ - C/C++ 服务器不发送最后几行文件

python 中的 C++ 方法重载

design-patterns - 使用存储库模式处理集合的说明

c++ - 从基类继承 operator new

c++ - 如何检查QImage是否有效?

c++ - 在 pthread_create() 中使用局部变量作为参数是否有效?

c# - 使用分部类扩展 WebControl