gpt4 book ai didi

c++ - 禁止 child 调用 parent 的抽象(或虚拟)函数

转载 作者:行者123 更新时间:2023-12-01 14:30:40 31 4
gpt4 key购买 nike

我有一个调用抽象回调的父类。子类旨在覆盖此回调,但绝不能从其代码中自行调用它。

class Parent(){
public:
void Init(){ MyCallback(); }

protected:
virtual void MyCallback() = 0;//child must override, but child must never call it manually.
};


class Child : public Parent{
protected:
void MyCallback()override{ }

private:
void SomeCode{ MyCallback(); }//<---how to prevent this?
}

诸如此类的回调有很多。我不希望用户迷路并认为他应该手动调用它们中的任何一个。

是否可以防止这些回调被子类调用?

最佳答案

我认为没有办法在编译时强制执行你想要的规则,但你可以在运行时通过断言失败来强制执行它们,这是次好的方法,因为至少任何人破坏了规则将在下次运行程序时了解他们的方法错误。请注意,我添加了一个要求,即 MyCallback() 的子类覆盖必须恰好调用父类(super class)方法一次,以防止子类无故地对自身或 MyCallback() 进行额外调用他们的父类(super class)在允许回调的上下文中。

#include <stdio.h>
#include <stdlib.h>

class Parent
{
public:
Parent() : _okayToCallCount(0), _numParentClassCallsMade(0) {/* empty */}

protected:
virtual void MyCallback()
{
if (_okayToCallCount == 0) {printf("MyCallback() was called from an invalid context!\n"); abort();}
_numParentClassCallsMade++;
if (_numParentClassCallsMade > 1) {printf("Parent::MyCallback() was called more than once from the subclass's override-method!\n"); abort();}
}

private:
// This is the only place that MyCallback should EVER be called from!
void TheOnlyPlaceThatMyCallbackShouldEverBeCalledFrom()
{
_numParentClassCallsMade = 0;

_okayToCallCount++;
MyCallback();
_okayToCallCount--;

if (_numParentClassCallsMade < 1) {printf("Parent::MyCallback() was never called from the subclass's override-method!\n"); abort();}
}

int _okayToCallCount;
int _numParentClassCallsMade;
};

class Child : public Parent
{
public:
Child() {}

void SomeCode() { MyCallback(); }//<---how to prevent this?

protected:
virtual void MyCallback()
{
Parent::MyCallback(); // REQUIRED!
}
};

int main(int argc, char ** argv)
{
Child c;
c.SomeCode();

return 0;
}

关于c++ - 禁止 child 调用 parent 的抽象(或虚拟)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61920178/

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