访问说明符和虚函数

时间:2010-09-24 10:27:16

标签: c++ virtual

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

2 个答案:

答案 0 :(得分:10)

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

有时会出现与虚拟功能相关的常见错误。

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

// 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

答案 1 :(得分:0)

虚拟函数在基类中使用时就像常规函数(纯虚函数的例外)。

总结一下:

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

Public是接口,private / protected函数是内部。 另请注意,所有局部变量(根据封装)都应该受到保护/私有。

现在,当涉及到派生类时,你得到一个这样的类:

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

现在,B前面的public / private / protected限定符规定了从基类继承的限制最少的安全级别。对于方法和局部变量而言,这不是“过滤器”,因为某些方法和局部变量没有被继承,只是如果它们受到较少的限制(更公开),它只会将其安全级别更改为指定的级别。

所以class A : public B将保留继承的基本成员, class A : private B会将所有内容更改为私人成员。

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