【问题标题】:Access specifiers and virtual functions访问说明符和虚函数
【发布时间】:2010-09-24 10:27:15
【问题描述】:

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

【问题讨论】:

    标签: c++ virtual


    【解决方案1】:

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

    在虚函数方面有时会发生一个常见错误。

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

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

    【讨论】:

    • “提前大脑编译代码”哈哈,这是@sbi 的模式。也许我也应该从这种介绍开始我的代码。经常发生我的代码脑死了
    【解决方案2】:

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

    从我的头顶总结:

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

    公共是接口,私有/受保护的功能是内部。 另请注意,所有局部变量(根据封装)都应受保护/私有。

    现在,对于派生类,您可以像这样派生一个类:

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

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

    所以class A : public B 将保留继承的基成员,而, class A : private B 会将它们全部更改为私有成员。

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

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 2011-01-15
      • 2016-09-19
      • 1970-01-01
      相关资源
      最近更新 更多