gpt4 book ai didi

c++ - 如何在运行时确保继承类中的成员函数是私有(private)的? (C++, 海合会)

转载 作者:太空宇宙 更新时间:2023-11-04 09:54:32 25 4
gpt4 key购买 nike

A 是基类,B 是继承类。 AB 中获取绑定(bind)了 boost::bind+boost::function 的成员函数指针,以便稍后从其他基类函数中存储和执行。 AB 类位于单独的包含文件中。我想限制从A实现继承类的开发者继承类中绑定(bind)的成员函数指针是私有(private)函数。环境为C++、gcc 4.x和Linux。

示例:

------ INCLUDE FILE -----

#include <boost/bind.hpp>
#include <boost/function.hpp>

struct A
{
protected:
void Register(const char* name, boost::function<void()> FuncPtr)
{
// (I am not intended to pass the name argument, but probably somebody
// knows something gcc magic which would use it to solve the problem.)
// I want to ensure that FuncPtr points to a private member
// function. What can be known: "B::CalledFunction" string and FuncPtr.
// If it is not a private member function then drop an error message
// during run-time or during compilation (???).
}
};

------ OTHER INCLUDE FILE -----
...

struct B : public A
{
B() : A()
{
Register("B::CalledFunction", boost::bind(&B::CalledFunction, this));
}

private:
void CalledFunction()
{
}
};

任何类型的宏魔术或类似的东西也可以在/而不是简单地直接调用 A::Register() 之前被欣赏。

最佳答案

我不会展开评论,而是提出一个基于真正使用继承的替代方案

#include <iostream>
#include <memory>

class A
{
public:
void call_a() { some_func_a(); }
private:
virtual void some_func_a() = 0; // pure virtual
};

class B : public A
{
private:
void some_func_a() { std::cout << "B::some_func_a" << std::endl; }
};

int main(void)
{
std::auto_ptr<A> a(new B);
// a->some_func_a(); // causes compiler error
a->call_a();
}

如果您在 B 中遗漏了 some_func_a 的定义,当您尝试实例化 B 时,您将遇到编译器错误。

关于c++ - 如何在运行时确保继承类中的成员函数是私有(private)的? (C++, 海合会),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7393936/

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