从内存来看类的继承

本文探讨了C++中继承的基本概念,并通过具体的代码示例详细解释了基类与派生类之间的赋值兼容性规则,包括对象赋值、指针指向等问题。

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

C++是面向对象的,那么存在继承关系时,下面四个问题,请作答!

1. 那么父类对象可以赋值给派生类对象吗?

2. 派生类对象能赋值给父类对象吗?

3. 能用父类指针指向派生类对象吗?

4. 能用派生类指针指向父类对象吗?

实现如下继承:父类animal 和 子类 dog

那么派生类dog对象的内存分布如下图
在这里插入图片描述

继续回答上述问题:
1. 那么父类对象可以赋值给派生类对象吗?

不能,因为父类对象无法为派生类独有的成员赋值,导致赋值失败!!!

2. 派生类对象能赋值给父类对象吗?

 可以,因为派生类对象中有父类中的内容

3. 能用父类指针指向派生类对象吗?

可以,因为派生类中有父类的部分,那么父类指针其实只会指向派生类中从派生类中继承过来的部分。

在这里插入图片描述

4. 能用派生类指针指向父类对象吗?

不可以,因为派生类指针寻址范围大于父类的内存,导致访问未知内存。

编程进行验证

#include<iostream>
using namespace std;

class animal {
private:
    int temp;
public:
    virtual void speak() {
        std::cout<< "animal speak"<<std::endl;
    }
    void print() {
        std:: cout<<"animal"<<std::endl;
    }
};

class dog :  public animal {
private:
    int tmp;
public:
    void speak() override {       //改写继承的虚函数
        std::cout << "dog speak! "<<std::endl;
    }  
    void speak(int i) {       //"并不是改写继承的虚函数, 而是子类独有的函数"
        std::cout<<"dog i speak! "<<std::endl;
    }
    void print() {
        std::cout<<"dog"<<std::endl;
    }
};

int main() {
    dog d;
    animal a1;
    a1.speak();
    a1.print();

    animal *a2 = new animal;
    a2 -> speak();
    a2 ->print();

    animal *a3 = new dog;
    a3->speak();
    a3->print();

    //派生类对象可以赋值给基类对象,而基类对象不能赋值给派生类对象
    a1 = d;
    //d = a1; //错误,基类对象不能给派生类对象赋值;
    //dog *d = new animal; //错误,派生类指针不能指向基类对象

    delete a2;
    delete a3;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值