C++继承与多态:如何通过C对象直接调用B类show()方法
如何通过已创建的C对象直接调用B类的show()函数
当然可以做到!而且方法还挺直接的,完全不用修改C类的代码,也不用新建任何对象——甚至连你提到的强制类型转换都不是必须的(不过转换的方式也可行,下面会详细说)。
首先先假设你的类继承结构大概是这样的(毕竟你没给出具体代码,我先补一个符合场景的示例):
#include <iostream> using namespace std; class A { public: virtual void show() { cout << "I am A" << endl; } }; class B : public A { public: void show() override { cout << "I am B" << endl; } }; class C : public B { public: void show() override { cout << "I am C" << endl; } };
默认情况下,如果你创建一个C对象并调用show(),会触发虚函数的动态绑定,执行C类的版本。要跳过C的show()直接调用B的版本,有两种可靠的方式:
方法1:直接使用作用域解析运算符(最简洁)
这是最简单的方案,不需要任何类型转换,直接在C对象上通过基类的作用域指定要调用的函数:
C c; c.B::show(); // 直接执行B类的show(),完全不会触发C的show()
原理:C++的作用域解析运算符::会绕过虚函数的动态绑定机制,强制调用你指定类(这里是B)中的成员函数实现,不管当前对象的实际类型是什么。这完全符合你的需求——既不用修改C的代码,也不用新建对象,直接调用B的show()。
方法2:结合强制类型转换与作用域解析
如果你一定要用强制类型转换的方式,也是可行的,但必须配合作用域解析来避免动态绑定(否则转换后还是会调用C的show()):
C c; // 方式a:转换为B类指针 static_cast<B*>(&c)->B::show(); // 方式b:转换为B类引用 static_cast<B&>(c).B::show();
这里用static_cast是安全的,因为C是B的公有派生类,类型转换是合法的。不过说实话,这种方法比第一种多了一步转换,没必要舍近求远,第一种方法已经足够简洁。
注意事项
- 如果你只做类型转换而不加作用域解析(比如
static_cast<B*>(&c)->show();),因为show()是虚函数,C++还是会进行动态绑定,最终执行的还是C的show(),这不是你想要的结果,所以必须加上B::来明确指定调用的版本。 - 这种方式只适用于公有继承的情况,如果B和C之间是私有或保护继承,
static_cast会编译报错,因为派生类无法直接访问基类的接口(不过你的场景里应该是公有继承,否则也不会考虑调用B的show())。
总结一下:完全可以直接调用B类的show(),最便捷的方式就是用c.B::show()的形式,既满足你的所有要求,又简单易懂。
内容的提问来源于stack exchange,提问作者Muzahir Hussain
相关产品推荐
相关产品推荐

