C++ 如何在运行时确保继承类中的成员函数是私有的?(C+;+;,gcc)
A是基类,B是继承类A从与boost::bind+boost::function绑定的B中获取成员函数指针,以便稍后从其他基类函数存储和执行。A和B类位于单独的include文件中。我想限制从A实现继承类的开发人员,使继承类中的绑定成员函数指针是私有函数。环境是C++,GCC 4,X和Linux。 样本:C++ 如何在运行时确保继承类中的成员函数是私有的?(C+;+;,gcc),c++,linux,gcc,private-members,C++,Linux,Gcc,Private Members,A是基类,B是继承类A从与boost::bind+boost::function绑定的B中获取成员函数指针,以便稍后从其他基类函数存储和执行。A和B类位于单独的include文件中。我想限制从A实现继承类的开发人员,使继承类中的绑定成员函数指针是私有函数。环境是C++,GCC 4,X和Linux。 样本: ------ INCLUDE FILE ----- #include <boost/bind.hpp> #include <boost/function.hpp>
------ 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
{
受保护的:
无效寄存器(常量字符*名称,boost::函数FuncPtr)
{
//(我不打算通过名称争论,但可能是某人
//知道一些可以用来解决问题的东西。)
//我想确保FuncPtr指向一个私有成员
//可以知道的是:“B::CalledFunction”字符串和FuncPtr。
//如果不是私有成员函数,则删除错误消息
//在运行时或编译期间(???)。
}
};
------其他包括文件-----
...
结构B:公共A
{
B():A()
{
寄存器(“B::CalledFunction”,boost::bind(&B::CalledFunction,this));
}
私人:
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();
}
#包括
#包括
甲级
{
公众:
void call_a(){some_func_a();}
私人:
virtual void some_func_a()=0;//纯虚拟
};
B类:公共A
{
私人:
void some_func_a(){std::cout call_a();
}
如果您在B
中遗漏了某些函数a
的定义,那么当您尝试实例化B
时,将出现编译器错误。不幸的是,您请求的限制是不可能的。访问限制仅在编译时存在,而不是在运行时;它们唯一做的事情是控制(基于词法范围)可以引用哪些标识符
由于生成这些绑定成员函数的调用上下文显然可以访问其所有成员函数,因此无法在本地区分私有成员函数和公共成员函数-这排除了任何宏攻击。此外,成员函数指针不保留访问控制信息(这就是为什么可以从另一个类调用指向私有成员函数的指针)。因此,也不可能在其他地方进行检查
你可以将它作为编译器传递来实现,因为编译时的信息是可用的;但是,对于普通的C++编译器来说,这是不可能的。但是,这可能容易出现误报和假否定,因为这是一个有问题的情况。(如果某个派生类
B
真的想要一个绑定的公共成员函数,它将在其他地方使用,该怎么办?)为什么要强制执行此操作?在C++11中,访问规范的规则更改为在SFINAE之前应用,因此您将有机会进行一些宏攻击,以检测函数是否为私有函数。但是我认为这不值得,为什么必须设置这样的人为限制?其目的是什么?为什么不在中使用继承的使用方式?目的:在我的例子中,继承的类将实现新的函数,绑定并存储在基类中以供以后调用,但我想阻止使用类B的开发人员直接调用这些绑定函数。@kecsap:派生类的成员函数的可访问性不应该由派生类的作者决定?为什么基类要关心这两种情况?