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

 

原文链接: https://www.cnblogs.com/xkfz007/archive/2012/08/26/2657233.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++中虚函数的实现不受访问控制符的影响

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/60886

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午9:41
下一篇 2023年2月9日 上午9:41

相关推荐