如何在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
相关产品推荐
相关产品推荐

