指向子类对象的基类指针能访问子类中重载的虚函数,而不能访问其私有函数。
比如
class CBase
{
public:
CBase();
virtual void Print(){cout<<"base"<
};
class CDerived: public CBase
{
public:
CDerived();
virtual void Print(){cout<<"Derived"<
void Personal(){cout<<"Derived private owned"<
}
1. int main()
2. {
3. CDerived oderived;
4. CBase* pbase=&oderived;
5. pbase->Print();
6. pbase->Personal();
7. }
编译的时间,error: ‘class CBase’ has no member named ‘Personal’in line 6.
我的问题是,
1. 如果是因为pbase是CBase类型的指针,所以他只能访问CBase的那块空间
的话,为什么它还可以访问CDerived的重载虚函数?是因为所有的virtual function都放在v table上,如果子类有重载虚函数的话,这个子类的重载虚函数地址会替代原先基类的虚函数的地址。这样在基类访问virtual void Print()的时间,CBase里面的virtual void Print()最终是指向CDerived的virtual void Print()的了。
是不是这样的?
谢谢。
L**Q 发帖数: 834
2
这是C++ virtual function最基本的概念吧,RTTI。
Base class定义pure virtual function做为interface,derived class override
virtual function,run time link。
不是virtual function,返回base pointer被upcast成base class pointer,相当于
object被slice copy,当然不能访问derived class member function了。
【在 g***l 的大作中提到】 : 指向子类对象的基类指针能访问子类中重载的虚函数,而不能访问其私有函数。 : 比如 : class CBase : { : public: : CBase(); : virtual void Print(){cout<<"base"<: }; : class CDerived: public CBase : {