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;
}
#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.htmlthis is DerivedA dowork !