gpt4 book ai didi

c++ - 如何确保从我的派生类调用纯虚方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:25 25 4
gpt4 key购买 nike

我有以下情况:

#include <iostream>

class Base{
public:
Base() = default;
virtual void make_sure_im_called() = 0;
};

class Child : public Base {
public:
virtual void make_sure_im_called()
{
std::cout << "I was called as intended." << std::endl;
};
}

因此,我希望从 Base 派生的每个类都实现 make_sure_im_called()(通过将其设为纯虚拟来成功完成)。但是我如何断言从 Base 派生新类的人也被迫调用该函数?由于缺少实现,我从基类尝试的一切似乎都会失败。

最佳答案

在 C++ 中,没有内置构造可以执行您想要的操作,但您始终可以自己强制执行。

#include <iostream>

class Base{
public:
Base() = default;
void make_sure_im_called() {
before_make_sure_im_called();
// Your own code
after_make_sure_im_called();
}
protected:
// Hooks to be implemented
virtual void before_make_sure_im_called() = 0;
virtual void after_make_sure_im_called() = 0;
};

class Child : public Base {
protected:
virtual void before_make_sure_im_called() override
{
std::cout << "I was called as intended." << std::endl;
};
virtual void after_make_sure_im_called() override {}
}

这会产生 2 个虚拟调用(大多数情况下,您可以使用其中的 1 个)。如果有人调用 make_sure_im_called,这现在将调用纯虚拟调用。

通过保护它们,它们被调用的机会减少了,因为只有派生类才能访问它们。

强制在实例的生命周期内调用此方法。

方法 make_sure_im_called 不能从 Base 的构造函数中调用。没有可以强制执行此操作的构造,但是,如果不是这种情况,您可能会让程序崩溃。

#include <iostream>

class Base{
public:
Base() = default;
~Base() { assert(_initialized && "Some message"); }
void make_sure_im_called() {
before_make_sure_im_called();
// Your own code
after_make_sure_im_called();
_initialized = true;
}
protected:
// Hooks to be implemented
virtual void before_make_sure_im_called() = 0;
virtual void after_make_sure_im_called() = 0;

private:
bool _initialized{false};
};

class Child : public Base {
protected:
virtual void before_make_sure_im_called() override {};
virtual void after_make_sure_im_called() override {}
}

通过保留 _initialized 成员,您可以跟踪被调用的方法。在 Dtor 中,您可以对此断言并在它为假时使程序崩溃(仅限调试构建?)。读者练习:正确复制/移动构造/分配。

虽然解决方案可能不是那么优雅,但至少比什么都没有要好。人们甚至可以将其记录为 API 的一部分。

关于c++ - 如何确保从我的派生类调用纯虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43790646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com