C++ 多态

本文详细介绍了C++中多态的概念及其实现原理。探讨了多态实现的必要条件,并通过实例代码展示了虚函数表和vptr指针的作用,解释了为何在构造函数中无法实现多态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++多态实现效果

多态:同样的调用语句有多种不同的表现形态;接口的多种不同的实现方式。

多态实现的三个条件

         有继承、有virtual重写、有父类指针(引用)指向子类对象。

多态的C++实现

  virtual关键字,告诉编译器这个函数要支持多态;不要根据指针类型判断如何调用;而是要根据指针所指向的实际对象类型来判断如何调用
多态的理论基础

   动态联编(编译时不确定到底调用的是基类还是派生类的函数,运行时才确定)。根据实际的对象类型来判断重写函数的调用。

多态的重要意义

   设计模式的基础。

实现多态的理论基础

  函数指针做函数参数。

C++中多态的实现原理

每一个有虚函数的类(或有虚函数的类的派生类)都有一个虚函数表,虚函数表中列出了该类的虚函数地址,每个对象(注意这里是对象)中都有一个指向虚函数表的指针(vptr指针)。多出来的4个字节就是用来放虚函数表的地址的。

看下面程序:

#include<iostream>
using namespace std;

class Parent
{
private:
    int m_a;
public:
    Parent(int a = 0)
    {
        this->m_a = a;
    }
    ~Parent()
    {
    }
    virtual void print()//virtual关键字
    {
        cout<<"parent"<<endl;
    }
};

class Child:public Parent
{
private:
    int m_c;
public:
    Child(int c = 0)
    {
        this->m_c = c;
    }
    ~Child()
    {
    }
    virtual void print()//继承并实现函数的重写
    {
       cout<<"Child"<<endl;
    }
};

void main()
{
    Parent *p_a;
    Child c_a;

    p_a = &c_a;
    p_a->print();// 多态的体现
    cout<<"parent"<<sizeof(Parent)<<endl;
    cout<<"child"<<sizeof(Child)<<endl;
    system("pause");
}
其运行结果是:

至于sizeof(Parent)结果为什么是8?一个int 型变量4个字节外加vtpr 指针4个字节(虚函数表是由编译器自动生成与维护的)(类的成员函数和类的对象是分开存储的)。

构造函数中能调用虚函数,实现多态吗?

对象在创建的时,由编译器对VPTR指针进行初始化

只有当对象的构造完全结束后VPTR的指向才最终确定

父类对象的VPTR指向父类虚函数表

子类对象的VPTR指向子类虚函数表

因此,在造函数中调用多态函数,不能实现多态。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值