如何调用调用类声明之后被重写的C++类成员方法?
如何让C++派生类的重写函数被正确调用?
原始代码如下:
class A { public: A(){}; void some_func(){ std::cout << 1; }; }; class B { A* my_A; public: B(A* a) : my_A{a} {}; void use_A() { my_A->some_func(); } }; class C : public A { public: C(){}; void some_func() { std::cout << 2; } }; int main() { C new_c; B new_b(&new_c); new_b.use_A(); }
这段代码调用基类A的some_func输出1,核心原因是基类A中的some_func不是虚函数——C++只有虚函数才支持动态绑定,也就是运行时根据指针实际指向的对象类型,调用对应派生类的重写函数。
要实现输出2的需求,只需做两处修改:
- 在基类
A的some_func前添加virtual关键字,将其声明为虚函数 - (可选但推荐)在派生类
C的some_func后加上override关键字,明确标记这是对基类虚函数的重写,编译器会自动检查重写的合法性(比如函数签名是否匹配)
修改后的完整代码:
class A { public: A(){}; // 声明为虚函数,开启动态绑定 virtual void some_func(){ std::cout << 1; }; }; class B { A* my_A; public: B(A* a) : my_A{a} {}; void use_A() { my_A->some_func(); } }; class C : public A { public: C(){}; // 用override明确重写,C++11及以上版本支持 void some_func() override { std::cout << 2; } }; int main() { C new_c; B new_b(&new_c); new_b.use_A(); // 现在会输出2 }
修改后,程序运行时会根据my_A实际指向的C对象,调用C类中重写的some_func,最终输出2。
内容的提问来源于stack exchange,提问作者Violeta
相关产品推荐
相关产品推荐

