2010-09-24 69 views
1

在C++指定的3个不同的访问说明符(public,private,protected)下声明虚函数时,可访问性的规则是什么 每个函数的意义是什么?任何简单的代码示例来解释这个概念将非常有用。访问说明符和虚函数

+0

访问关于她的关于关于 – 2010-09-24 13:34:02

回答

8

访问说明符的应用方式与在名称查找过程中对其他任何名称的应用方式相同。功能是虚拟的这一事实根本不重要。

在虚拟功能方面有时会发生常见错误。

如果名称查找将可行函数确定为虚函数,则在用于命名该函数的对象表达式的静态类型的范围内检查虚函数的访问说明符。在运行时,要调用的实际函数可以使用完全不同的访问说明符在派生类中定义。这是因为'访问说明符'是编译时间表单子。

// Brain compiled code ahead 
struct A{ 
    virtual void f() {} 
private: 
    virtual void g() {} 
protected: 
    virtual void h() {} 
}; 

struct B : A{ 
private: 
    virtual void f() {}   // Allowed, but not a good habit I guess! 
}; 

B b; 
A &ra = b; 

ra.f(); // name lookup of 'f' is done in 'A' and found to be public. Compilation 
      // succeeds and the call is dynamically bound 
      // At run time the actual function to be called is 'B::f' which could be private, protected etc but that does not matter 
+0

谢谢!很好的解释。 – 2010-09-24 10:48:36

+0

“大脑编译代码”大声笑,这是@ sbi的模式。也许我应该从我的代码开始介绍这种介绍。经常发生我的代码脑死亡 – 2010-09-25 12:31:29

+0

@Johannes Schaub - litb::), – Chubsdad 2010-09-25 12:59:37

0

在基类中使用虚函数就像普通函数(纯虚函数除外)一样。

从我的头顶总结:

公共职能的任何人都可以访问。 私有函数只能访问类和其朋友 受保护的函数就像私有函数一样,只有它们可以被派生类访问。

public是接口,而private/protected函数是内部的。 还要注意,所有的局部变量(根据封装)应该被保护/私有。

现在,当它涉及到派生类,你派生类是这样的:

class A : [public | protected | private] B 
{ 
}; 

现在,公共/私营/保护盈B的资格规定限制最少的安全级别从基继承类。对于方法和局部变量来说,这不是一个“过滤器”,因为有些不是继承的,只是将它们的安全级别更改为指定的安全级别,如果它们的限制较少(更公开)。

因此class A : public B将离开继承的基本成员, class A : private B会将它们全部更改为私有成员。

希望这对你有意义并回答你的问题。如果没有,告诉我!