代码之家  ›  专栏  ›  技术社区  ›  Alok Save

访问说明符和虚拟函数

  •  2
  • Alok Save  · 技术社区  · 16 年前

    当虚函数在C++指定的3个不同访问说明符(公共、私有、受保护)下声明时,可访问性的规则是什么? 每一个都有什么意义?任何解释这个概念的简单代码示例都将非常有用。

    2 回复  |  直到 16 年前
        1
  •  9
  •   Chubsdad    16 年前

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

    对于虚拟函数,有时会出现一个常见的错误。

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

    // 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
    
        2
  •  0
  •   Alexander Rafferty    16 年前

    当虚拟函数在基类中使用时,它们就像常规函数(纯虚拟除外)。

    从我的头上总结:

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

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

    现在,当涉及到派生类时,您可以派生这样的类:

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

    现在,b前面的public/private/protected限定符声明从基类继承的限制最小的安全级别。在某些方法和局部变量没有继承的意义上,这不是它们的“过滤器”,它只是将它们的安全级别更改为指定的安全级别,如果它们受到较少的限制(更公开)。

    所以 class A : public B 将保留继承的基础成员, class A : private B 将全部更改为私人成员。

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