zoukankan      html  css  js  c++  java
  • C++中虚函数的实现不受访问控制符的影响

    多态性与将实现多态的函数的访问限定符没有任何关系,private 函数仍然可以实现多态,它的指针仍然位于vtbl中,只不过此时该函数的多态一般只能在基类的内部由其他非虚函数调用该函数的时候反映出来(而无法直接在类外部调用该函数来实现多态),访问限定符仅仅限制外部对类的成员的访问权限,它并没有破坏以下规则:
     通过基类指针或引用调用成员函数时,如果该函数时非虚的,那么将采用静态绑定,即编译时绑定;如果该函数是虚拟的,则采用动态绑定,即运行时绑定。
    如下面的例子:
    #include <iostream>
    #include <string>
    using namespace std;
    class Base{
        private:
            virtual string classID()const{
                return string("Base");
            }
        protected:
            virtual void dowork()=0;
        public:
            void work(){
                cout<<"this class id is "<<classID()<<endl;
                dowork();
            }
            virtual ~Base(){}
    };
    class DerivedA:public Base{
        private:                                                    
            virtual string classID()const{
                return string("DerivedA");
            }
        protected:
            void dowork(){
                cout<<"this is DerivedA dowork !"<<endl;
            }
    };
    int main(){
        Base* bp=new DerivedA();
        bp->work();
    //    string s=bp->classID(); //这儿无法直接调用classID来实现多态,因为这个函数是private的,如果改成public之后就可了
    //    cout<<s<<endl;
        delete bp;
    }
    输出就是:
    this class id is DerivedA
    this is DerivedA dowork !
    参考:http://www.cppblog.com/zhuweisky/archive/2011/12/30/269.html
  • 相关阅读:
    Linux 编程笔记(四)
    渗透测试搜索指令整理(一)
    Linux 编程笔记(三)
    Winhex数据恢复笔记(五)
    Winhex数据恢复学习笔记(四)
    Winhex数据恢复学习笔记(三)
    Linux编程学习笔记(二)
    Linux编程学习笔记(一)
    工控系统安全问题汇总(一)
    WinHex数据恢复笔记(二)
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2657233.html
Copyright © 2011-2022 走看看