You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将派生类对象存入基类指针?相关技术疑问解析

基类指针指向派生类对象的常见问题解析

先看你给出的示例代码:

class Base
{
    int a;    // An object of Base would be of 4 bytes
};

class Derived : public Base
{
    int b;    // This makes Derived of 8 bytes
};

int main()
{
    Base* obj = new Derived();    // Is this consistent? I am trying to store objects of Derived type into memory meant for Base type
 
    delete obj;

    return 0;
}

1. 能否通过基类指针obj访问派生类的非继承成员b?

直接访问不行。编译器会根据指针的静态类型(也就是Base*)做编译期检查,Base类里并没有定义b成员,所以直接写obj->b会触发编译错误。

如果确实需要访问b,可以通过类型转换实现,比如static_cast<Derived*>(obj)->b,或者在基类包含虚函数时用更安全的dynamic_cast<Derived*>(obj)(转换成功后再访问)。但这种做法不推荐,因为它破坏了多态的封装性,若指针实际指向的不是Derived对象,会导致未定义行为。

2. Base* obj = new Derived();会不会引发对象切片?

不会。对象切片的场景是将派生类对象直接赋值给基类对象,比如Base base_obj = Derived();——这时候只有派生类中的基类部分会被拷贝到base_obj里,派生类独有的b会被"切掉",丢失数据。

而基类指针指向派生类对象时,指针仅存储派生类对象的起始地址,整个派生类对象的内存(包含a和b)都完整保留,没有任何数据被切片。指针只是限制了我们通过它只能访问基类定义的成员,对象本身仍是完整的Derived类型。

3. 为什么这种模式在多态实现中如此普遍?

这种模式是C++运行时多态的基础,核心原因有两点:

  • 动态绑定:当基类包含虚函数时,基类指针(或引用)指向派生类对象时,调用虚函数会根据对象的动态类型(实际是Derived)执行对应的派生类实现,这是多态的核心逻辑。
  • 代码灵活性:用基类指针作为接口,可以统一处理所有派生类对象。比如写一个接受Base*的函数,就能支持任何Base的子类,不用为每个子类单独编写逻辑,符合开闭原则,代码扩展性更强。

另外,指针仅存储地址,不会额外拷贝对象,性能上也更高效。

内容的提问来源于stack exchange,提问作者Kshitij_9192

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:20:37