栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 派生类赋值给基类指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 派生类赋值给基类指针

基类和派生类的关系
基类和派生类不是2个独立的类型,派生类是一个基类的类型,它们2个不是分开的,当我们创建一个派生类的时候,派生类中的数据member应该如下

BaseClass : [Base Data]
DerivedClass : [Base Data][Derived Data]

派生类的数据类型附加于基类之后
当我们给一个基类类型指向派生类的时候,这个基类指针访问的是派生类继承基类的那部分数据,就算我们在派生类中重新更改继承而来的基类类型,基类指针访问的还是原来的数值,如下

#include 

using namespace std;

class Base{
public:
    int Base_value1 = 1;
    int Base_value2 = 2;
    
};

class Derived : public Base{
public:
    int Derived_value1 = 3;
    int Derived_value2 = 4;
    
    int Base_value1 = 10;
    
};

int main()
{
    Base* b = new Derived;
    cout<< b->Base_value1 << "n";

    return 0;
}

我们的输出结果如下为1,说明访问的还是base的变量

1

假如我们想做到这个Base 指针访问Derive特有的成员而不是访问从自己身上继承而来的,这个时候虚函数就派上用场了!!!我们在Base中定义一个纯虚函数,然后Derive继承他,并且重载他,因为纯虚函数本来就被Derive继承,本来存于Derive继承Base的member区域中,Derive这个区域中的虚函数是一个虚表指针,虚表指针直接指向这个obj的虚表,这个虚表里面才是具体执行函数的地址,并且Derive进行了override,所以Derive继承而来的虚函数最终指向的是这个Derive override后的函数,如下

#include 

using namespace std;

class Base{
public:       
    virtual void print() = 0; //纯虚函数
};



class Derived : public Base{
public:
     void print() override;
    
};

void
Derived::print(){
    cout << "Derived_Print!" << "n";
}

int main()
{
    Base* b = new Derived;
    b->print();
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869481.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号