c++ - 如何重写代码不从构造函数调用虚函数
问题描述
所以很快情况就是这样
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
是公共的,在不同的地方被称为,它也有一些逻辑,不仅仅是分配,因为Base
和Derived
类都很大。但这一切都没有按预期工作,因为当从构造函数调用函数时,动态绑定不起作用。我看到了将代码从 setZero 复制到构造函数的解决方案,但是重复代码是一件坏事。还有其他解决方案吗?
解决方案
作为其他答案的替代方案,将功能与 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";
}
};
推荐阅读
- c# - CSS Isolations 将基类视为不同的类
- python - 使用具有不同时区的日期时间 (discord.py)
- python - 如何将 BinaryRelevance.predict 结果转换为标签名称?
- python - Django:如何在表单中预先输入数据?
- python - 如何读取数据(使用熊猫?)使其格式正确?
- c++ - CMake 在 Winows 下从源代码构建 SDL_image
- jenkins - 如何在动态生成的詹金斯阶段使用构建后操作
- reactjs - 指定具有未知参数的函数数组会引发类型错误
- haskell - 哈斯克尔。如何在纯 Haskell 函数中进行 IO?执行函数时如何打印中间结果?
- swift - 如何使 SwiftUI TabView 背景透明?