假设您获得以下UML类图:
Mystery
类型的变量是否可以调用函数DoSomething()
?
我了解对象(例如Mystery X;
)可以调用GetA()
来访问私有变量int a
并且只需int b
即可访问公共变量X.b
但是这个对象X
如何访问私有函数DoSomething()
如果它甚至可能吗?
答案 0 :(得分:3)
我很难理解你的要求,但我想我已经明白了。
如果你问是否给出以下声明:
class Mystery
{
/*...*/
private:
void DoSomething();
};
你可以这样做:
Mystery m;
m.DoSomething();
...然后答案是否定的。您不能从类的上下文之外调用private
成员函数(或引用private
成员变量)。只有Mystery
的其他成员函数才能调用private
。例如:
void Mystery::Foo()
{
DoSomething(); // this would be possible if Foo() is a member of Mystery
}
编辑:
你不仅不能从课外召唤private
成员,也不能从子类中调用它们。例如,这是无效的:
class Base
{
private:
void Foo() {};
};
class Child : public Base
{
public:
void Bar()
{
Foo(); // ERROR: Can't call private method of base class
}
};
答案 1 :(得分:1)
有一个(编辑 - 为了完整性,有不止一个,请参阅注释)奇怪的方式,私人成员函数可以在你的课外调用,但它需要一些人为的例子,你在可以返回指向此函数的指针:
class Mystery;
typedef void (Mystery::*fptr)();
class Mystery{
void DoSomething() {};
public:
static fptr GetPrivateDoSomething()
{
return &DoSomething;
}
};
int main(int argc, char *argv[])
{
Mystery m;
fptr ds = Mystery::GetPrivateDoSomething();
(m.*ds)();
return 0;
}
话虽如此,不这样做。私有方法是私有的,因为它们体现了设计的隐藏方面,并且从未打算成为暴露界面的一部分。这意味着他们可能会受到行为改变,甚至完全删除。另外,做这些类型的恶作剧会导致代码高度笨拙地耦合,这是不可取的。
那是,我确实使用了它并且它运行得很好,尽管它处于一个完全不同的环境中,它有助于减少耦合(它在一个高度模块化的事件注册方案,如果你想知道的话。)
答案 2 :(得分:0)
允许类中的任何方法访问私有变量和方法。它的工作方式与调用任何其他方法完全相同,只是如果您尝试从类外部执行此操作,编译器将给您一个错误。