首页 > 解决方案 > 如何重写代码不从构造函数调用虚函数

问题描述

所以很快情况就是这样

class Base
{
public:
    Base() {  setZero();}
    virtual void setZero() {std::cout << "Set all Base class values to zeros (default) values";}
};

class Derived : public Base
{
public:
    Derived () { }
    
    void setZero() override {
        Base::setZero(); 
        std::cout << "Set all Derived class values to zeros (default) values";
    }
};

setZero是公共的,在不同的地方被称为,它也有一些逻辑,不仅仅是分配,因为BaseDerived类都很大。但这一切都没有按预期工作,因为当从构造函数调用函数时,动态绑定不起作用。我看到了将代码从 setZero 复制到构造函数的解决方案,但是重复代码是一件坏事。还有其他解决方案吗?

标签: c++c++11inheritancevirtualclean-architecture

解决方案


作为其他答案的替代方案,将功能与 API 分离可让您使用所需的一般流程,同时避免整个“在构造函数中使用 vtable”问题。

class Base
{
public:
    Base() {
      setZeroImpl_();
    }

    virtual void setZero() { 
      setZeroImpl_(); 
    }

private:
  void setZeroImpl_() {
    std::cout << "Set all Base class values to zeros (default) values";
  }
};

class Derived : public Base
{
public:
    Derived () {
      setZeroImpl_();
    }
    
    void setZero() override {
        Base::setZero(); 
        setZeroImpl_();
    }

private:
  void setZeroImpl_() {
    std::cout << "Set all Derived class values to zeros (default) values";
  }
};

推荐阅读