由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 为什么指向子类对象的基类指针能访问子类中重载的虚函数,而不
相关主题
[合集] 基类函数已经是virtual了,为啥子类还要virtual啊?C++里,Base Class如何调用Derived Class的method
C++ 弱问一个C++重载<<错误?
C++问题大侠给解释下c++为何会允许这种polymorphism?
C++ Q98: Call member function in virtual function (转载)问个 C++到C的问题
子类的destructor被调用时,什么时候调用基类的destructor请问2个类的问题
问一个问题。。C++虚方法问题
请教个C++问题[合集] 关于vector存储value copy的一个问题
C++ virtual function 定义在 derived class 会怎么样?template 类的继承问题
相关话题的讨论汇总
话题: cbase话题: print话题: virtual话题: 子类话题: cderived
进入Programming版参与讨论
1 (共1页)
g***l
发帖数: 2753
1
指向子类对象的基类指针能访问子类中重载的虚函数,而不能访问其私有函数。
比如
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
: {

1 (共1页)
进入Programming版参与讨论
相关主题
template 类的继承问题子类的destructor被调用时,什么时候调用基类的destructor
Calling pure virtual method问一个问题。。
static polymorphism一问请教个C++问题
[c++] virtual member?C++ virtual function 定义在 derived class 会怎么样?
[合集] 基类函数已经是virtual了,为啥子类还要virtual啊?C++里,Base Class如何调用Derived Class的method
C++ 弱问一个C++重载<<错误?
C++问题大侠给解释下c++为何会允许这种polymorphism?
C++ Q98: Call member function in virtual function (转载)问个 C++到C的问题
相关话题的讨论汇总
话题: cbase话题: print话题: virtual话题: 子类话题: cderived