如何用单个SECOND类型对象调用两个同名的类成员函数?
解决方案
要实现用SECOND类的同一个对象S调用两个同名的display函数,我们需要先处理类之间的关系——默认情况下,独立的FIRST和SECOND类无法通过同一个对象互相调用成员函数。最安全且符合C++规范的方式是让SECOND公有继承FIRST,这样就能通过作用域解析运算符区分调用基类和派生类的同名函数。
步骤1:调整类的继承关系
首先修改SECOND类的定义,让它公有继承FIRST:
#include <iostream> using namespace std; class FIRST { int num1; public: FIRST() { num1 = 1; } void display() /* function 1 */ { cout << num1 << endl; } }; // 让SECOND公有继承FIRST,获得基类的成员访问权限 class SECOND : public FIRST { int num2; public: SECOND() { num2 = 2; } void display() /* function 2 */ { cout << num2 << endl; } };
步骤2:在main函数中完成调用
现在用SECOND的对象S,就可以分别调用两个同名函数了:
int main() { SECOND S; // 调用FIRST类的display函数(函数1):用作用域解析符明确指定基类 S.FIRST::display(); // 调用SECOND类的display函数(函数2):直接调用,默认匹配派生类的版本 S.display(); return 0; }
特殊情况:无法修改类定义(不推荐)
如果因为限制不能修改原有类的结构,只能通过类型转换强行调用,但这属于未定义行为(SECOND和FIRST的内存布局完全不同,访问num1会读取错误的内存区域),仅作参考:
int main() { SECOND S; // 强行转换为FIRST指针调用,存在内存访问风险,不推荐使用 reinterpret_cast<FIRST*>(&S)->display(); // 调用SECOND的display函数 S.display(); return 0; }
这种方式可能输出不可预料的结果,所以强烈建议使用继承的方式来实现需求。
内容的提问来源于stack exchange,提问作者Alex Mercer
相关产品推荐
相关产品推荐

