定义一个基类BaseClass,从它派生出类DerivedClass。BaseClass有成员函数fn1(),fn2()。fn1()是虚函数;DerivedClass也有成员函数fn1(),fn2()

#include <iostream>
using namespace std;

class BaseClass {
public:
    virtual void fn1() {
        cout << "BaseClass:fn1()" << endl;
    }
    void fn2() {
        cout << "BaseClass:fn2()" << endl;
    }
};

class DerivedClass : public BaseClass {
public:
    void fn1() override {
        cout << "DerivedClass:fn1()" << endl;
    }
    void fn2() {
        cout << "DerivedClass:fn2()" << endl;
    }
};

int main() {
    DerivedClass dc;
    BaseClass *pb = &dc;
    DerivedClass *pd = &dc;
    pb->fn1();
    pb->fn2();
    pd->fn1();
    pd->fn2();
    return 0;
}

程序运行结果如下:

DerivedClass:fn1()

BaseClass:fn2()

DerivedClass:fn1()

DerivedClass:fn2()

  • pb->fn1();: 使用指向基类的指针调用虚函数fn1()。由于fn1()在基类中被声明为虚函数,因此在运行时会根据对象的实际类型进行动态绑定。因为指针pb指向的是一个DerivedClass对象,所以调用的是DerivedClass中的fn1(),输出 DerivedClass:fn1()

  • pb->fn2();: 使用指向基类的指针调用非虚函数fn2()。非虚函数在编译时就会确定调用的版本,因此无论指针类型是什么,都会调用基类的版本,输出 BaseClass:fn2()

  • pd->fn1();: 使用指向派生类的指针调用虚函数fn1()。同样,由于fn1()是虚函数,会根据对象的实际类型进行动态绑定。指针pd指向的是一个DerivedClass对象,所以调用的是DerivedClass中的fn1(),输出 DerivedClass:fn1()

  • pd->fn2();: 使用指向派生类的指针调用非虚函数fn2()。与第二步相似,非虚函数在编译时就会确定调用的版本,因此无论指针类型是什么,都会调用派生类的版本,输出 DerivedClass:fn2()

  • 由于虚函数的动态绑定特性,调用基类和派生类的虚函数会根据对象的实际类型来确定调用哪个版本,而对于非虚函数,则根据指针的类型来确定调用哪个版本。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值