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

如何在C++中将派生类转换为基类后调用重写的方法

问题场景与需求

先看你给出的代码:

类A的定义:

class A {
 public:
  void Hello(){
     std::cout << "Hi from class A!" << std::endl;
  }
};

继承自A的类B:

class B : public A {
 public:
  void Hello(){
     std::cout << "Hi from class B!" << std::endl;
  }
};

你创建对象并转换的代码:

B myB;
A myA = static_cast<A>(myB);

现在希望调用myA.Hello();时输出Hi from class B!。

问题原因

你当前的写法触发了对象切片:当把派生类对象myB赋值给基类对象myA时,只会拷贝myB中属于基类A的部分,myB特有的内容会被"切掉"。最终myA就是一个纯粹的A类型对象,和原myB没有关联,所以调用Hello()只会执行A的版本。

解决方案:利用虚函数与多态

要实现你想要的效果,需要C++的多态机制,核心是两个关键点:

  • 把基类的Hello()声明为虚函数
  • 使用基类指针或引用指向派生类对象(而非直接赋值对象)

修改后的代码示例

1. 基类A声明虚函数

class A {
 public:
  virtual void Hello(){ // 添加virtual关键字,将方法声明为虚函数
     std::cout << "Hi from class A!" << std::endl;
  }
};

2. 派生类B重写虚函数(可选但推荐加override)

class B : public A {
 public:
  void Hello() override { // override关键字明确表示重写基类虚函数,避免拼写错误
     std::cout << "Hi from class B!" << std::endl;
  }
};

3. 使用指针或引用调用

方式一:基类指针

B myB;
A* myA = &myB; // 基类指针指向派生类对象
myA->Hello(); // 触发多态,调用B的Hello(),输出"Hi from class B!"

方式二:基类引用

B myB;
A& myA = myB; // 基类引用绑定派生类对象
myA.Hello(); // 触发多态,调用B的Hello(),输出"Hi from class B!"

原理说明

当基类方法被声明为虚函数后,编译器会为每个拥有虚函数的类生成虚函数表,记录虚函数的地址。通过基类指针或引用调用虚函数时,程序会根据指针/引用实际指向的对象类型,去对应的虚函数表里查找并执行正确的函数版本,从而实现多态效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:10:36