关于C++中私有继承后虚函数的访问权限与私有继承后多态的问题
2007-04-28 11:57
786 查看
class Base{
public:
void NoVirtualFun()
{
printf("Base::NoVirtualFun()!\n");
}
virtual void VirtualFun()
{
printf("Base::VirtualFun()!\n");
}
};
class ClassA{
private:
Base* m_pBase;
public:
ClassA() : m_pBase(NULL)
{}
void AddBase(Base* pBase)
{
m_pBase = pBase;
}
void Print()
{
//此处使用的访问权限是Base::VirtualFun()的访问权限(public)
//因此在ClassA中可以使用该虚函数,而忽略派生类Child中该函数的权限设置。
m_pBase->VirtualFun();
}
};
//注:私有继承
class Child: private Base{
private:
ClassA* m_pClassA;
private: //私有
virtual void VirtualFun()
{
printf("Child::VirtualFun()!\n");
}
public:
Child(ClassA* pClassA)
{
m_pClassA = pClassA;
m_pClassA->AddBase(this);
}
};
//1.使用Private继承后,无法在类作用域外直接使用多态,
// 派生类指针无法自动转型为基类指针.
//2.从基类private继承虚函数后,若在派生类中将该虚函数重载,
// 并设置访问权限为public,该虚函数将为public成员函数.
int main(int argc, char* argv[])
{
ClassA* classA = new ClassA();
Child* chd = new Child(classA);
// classA->AddBase((Base*)chd); 允许强制转型为基类指针
// classA->AddBase(chd); 错误,无法自动转换为基类指针
classA->Print();
//若在Child中将VirtualFun()指定为Public,该函数将作为public的成员函数,
//而不是private继承后的private成员函数
// chd->VirtualFun(); Error 此时为私有成员,若将Chlid::VirtualFun()的访问权限设为public则正确
delete chd;
delete classA;
return 0;
}
结论:
1. 私有继承的虚函数, 其访问权限可由派生类指定.
2. 私有继承后, 无法在派生类作用域外进行多态, 派生类指针无法自动转换为基类指针(但可强制类型转换).
3. 当派生类将基类中public权限的虚函数重载并限制为private或protected时, 多态时直接使用基类指针将忽略派生类对该虚函数访问权限的更改,以基类函数的访问权限为依据调用该虚函数.
public:
void NoVirtualFun()
{
printf("Base::NoVirtualFun()!\n");
}
virtual void VirtualFun()
{
printf("Base::VirtualFun()!\n");
}
};
class ClassA{
private:
Base* m_pBase;
public:
ClassA() : m_pBase(NULL)
{}
void AddBase(Base* pBase)
{
m_pBase = pBase;
}
void Print()
{
//此处使用的访问权限是Base::VirtualFun()的访问权限(public)
//因此在ClassA中可以使用该虚函数,而忽略派生类Child中该函数的权限设置。
m_pBase->VirtualFun();
}
};
//注:私有继承
class Child: private Base{
private:
ClassA* m_pClassA;
private: //私有
virtual void VirtualFun()
{
printf("Child::VirtualFun()!\n");
}
public:
Child(ClassA* pClassA)
{
m_pClassA = pClassA;
m_pClassA->AddBase(this);
}
};
//1.使用Private继承后,无法在类作用域外直接使用多态,
// 派生类指针无法自动转型为基类指针.
//2.从基类private继承虚函数后,若在派生类中将该虚函数重载,
// 并设置访问权限为public,该虚函数将为public成员函数.
int main(int argc, char* argv[])
{
ClassA* classA = new ClassA();
Child* chd = new Child(classA);
// classA->AddBase((Base*)chd); 允许强制转型为基类指针
// classA->AddBase(chd); 错误,无法自动转换为基类指针
classA->Print();
//若在Child中将VirtualFun()指定为Public,该函数将作为public的成员函数,
//而不是private继承后的private成员函数
// chd->VirtualFun(); Error 此时为私有成员,若将Chlid::VirtualFun()的访问权限设为public则正确
delete chd;
delete classA;
return 0;
}
结论:
1. 私有继承的虚函数, 其访问权限可由派生类指定.
2. 私有继承后, 无法在派生类作用域外进行多态, 派生类指针无法自动转换为基类指针(但可强制类型转换).
3. 当派生类将基类中public权限的虚函数重载并限制为private或protected时, 多态时直接使用基类指针将忽略派生类对该虚函数访问权限的更改,以基类函数的访问权限为依据调用该虚函数.
相关文章推荐
- C++中 public和private派生类继承问题和访问权限问题
- C++中 public和private派生类继承问题和访问权限问题
- 关于c++的私有继承,不可访问
- 面试中c++中单继承关于虚函数常遇到的4个问题
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++中public,protected,private派生类继承问题和访问权限问题
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- OC学习中关于@private@protected@pakege@public的访问权限和继承问题
- 关于static 访问权限、继承、多态、内部类结合在一起时的使用方法
- 学习笔记-----关于C++中类的成员函数可以访问私有成员的问题
- C++中 public和private派生类继承问题和访问权限问题
- C++中public,protected,private派生类继承问题和访问权限问题
- C++中 public和private派生类继承问题和访问权限问题
- [c++]子类私有的虚函数,多态问题
- C++ 类继承(廿一)--基类、派生类、多态继承、公有继承、私有继承、虚函数、保护继承、多重继承
- 关于C++中 虚函数 多态 和 访问限定符的思考
- C++中的 public和private以及protected派生类继承问题和访问权限问题
- C++中public,protected,private派生类继承问题和访问权限问题
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制