继承与访问权限

#include <iostream> using namespace std; class A { public: friend class Afnd;//A的友元类 virtual void vfun() {cout<<"A::vfun()"<<endl;}//虚函数vfun void callvfn(A& a) { a.vprifun();}//A的内部函数也可以表现出多态 private: virtual void vprifun() {cout<<"A::vprifun()"<<endl;}//私有虚函数vprifun }; class B:public A { //public: //改变虚函数vfun的访问属性为private virtual void vfun() {cout<<"B::vfun()"<<endl;} public: //改变虚函数vprifun的访问属性为public virtual void vprifun() {cout<<"B::vprifun()"<<endl;} }; class C:public B { //public: virtual void vfun() {cout<<"C::vfun()"<<endl;} //再次改变虚函数vprifun的访问属性为private virtual void vprifun() {cout<<"C::vprifun()"<<endl;} }; class D:protected C //改变继承属性 { public: virtual void vfun() {cout<<"D::vfun()"<<endl;} virtual void vprifun() {cout<<"D::vprifun()"<<endl;} }; class Afnd //A的友元类 { public: void test(A* pa) { pa->vprifun();//调用A的私有虚函数,可以表现出多态 } }; int main(void) { A a; B b; C c; D d; A* pa; B* pb; Afnd af; //b.vfun();//对象b无法访问自己的私有虚函数 pa=&b; pa->vfun();//通过基类指针pa可以访问B的私有虚函数 b.vprifun(); //通过改变基类vprifun的访问属性,可以直接调用私有虚函数vprifun pb=&c; pb->vprifun(); //通过B类指针,可以调用C类私有虚函数vprifun a.callvfn(c);//a通过成员函数调用私有虚函数 vprifun af.test(&b);//通过A的友元对象af 调用私有虚函数 vprifun //af.test(&d);//继承属性改为protected使得 虚函数 vprifun无法访问 //a.callvfn(d);//A的成员函数也无法访问D的虚函数 vfun //pa=&d; pa->vfun(); //通过指针基类pa也无法访问 D的虚函数 vfun d.vprifun();//通过public权限,对象d可以调用虚函数vprifun d.vfun();//通过public权限,对象d可以调用虚函数vfun system("pause"); return 0; }

 

虚函数的访问属性可以改变,并不影响虚函数的多态性

 

虚函数的非public调用

 

class CBase
{
public:
   
void fun1()
    {
        fun2_private();
    }
private:
   
virtual void fun2_private()=0;
};

class CDerive:public CBase
{
private:
   
virtual void fun2_private()
    {
        cout
<<"CDerive::fun2_private()"<<endl;
    }
};


int main()
{
    
   CBase
*pBase = new CDerive;
   pBase
->fun1();
   system(
"pause");
  
return 0;
}

你可能感兴趣的:(继承与访问权限)