当父类指针指向子类对象时的函数调用

这篇博客探讨了当父类指针指向子类对象时,函数调用的行为。通过示例代码展示了普通重写函数和虚函数的区别。在调用虚函数时,即使使用父类指针,也会动态绑定到子类的实现,体现了C++的多态特性。总结了动态绑定与类实例对象本身的关系,而非父类指针类型。
摘要由CSDN通过智能技术生成
class A
{
public:
 void FuncA()
 {
     printf( "FuncA called\n" );
 }
 virtual void FuncB()
 {
     printf( "FuncB called\n" );
 }
};
class B : public A
{
public:
 void FuncA()
 {
     A::FuncA();
     printf( "FuncAB called\n" );
 }
 virtual void FuncB()
 {
     printf( "FuncBB called\n" );
 }
};
void main( void )
{
 B  b;
 A  *pa;
 pa = &b;
 A *pa2 = new A;
 pa->FuncA(); ( 3)
 pa->FuncB(); ( 4)
 pa2->FuncA(); ( 5)
 pa2->FuncB();
 delete pa2;
}
父类指针指向子类实例对象,调用普通重写函数时,会调用父类中的函数。而调用被子类重写虚函数时,会调用子类中的函数。
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
父类是虚类的情况下,当父类中的函数a调用了父类的虚函数,并且在类中重写了这个虚函数,如果父类指针指向类对象,调用函数a可能会引发异常,出现访问权限冲突的情况。 这是因为在C++中,虚函数的调用是通过虚函数表来实现的。当父类指针指向类对象,调用函数a会先在父类的虚函数表中查找对应的虚函数,然后调用该虚函数。但是由于类重写了父类的虚函数,类的虚函数表中的对应位置存储的是类的虚函数地址。因此,当父类指针指向类对象,调用函数a会去父类的虚函数表中查找虚函数地址,但实际上调用的是类的虚函数。 这样就会导致访问权限冲突的问题。因为父类中的函数a可能依赖于父类的虚函数的实现,而类重写了这个虚函数,可能会改变虚函数的行为,导致函数a的逻辑出现问题。 为了避免这种访问权限冲突的问题,可以在父类中将虚函数声明为纯虚函数,即在函数声明后面加上`= 0`。这样父类就成为了抽象类,不能直接实例化对象,只能作为基类被继承。类必须实现纯虚函数,否则类也会成为抽象类。 示例代码如下所示: ```cpp class Base { public: virtual void func() = 0; // 纯虚函数 }; class Derived : public Base { public: void func() override { // 类实现纯虚函数 // 具体的实现逻辑 } }; int main() { Base* ptr = new Derived(); // 父类指针指向类对象 ptr->func(); // 调用虚函数 delete ptr; return 0; } ``` 这样,父类指针指向类对象,调用函数a就不会出现访问权限冲突的问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值