如何用void指针指向拥有虚函数不同实现的子类对象并调用虚函数?
问题解答
完全可行,这正是C++多态机制的典型应用场景——通过基类指针指向子类实例,自动调用子类重写的虚函数。
你的代码无法运行的核心原因是误用了void*类型指针,而非抽象基类Base*类型。void*是无类型指针,编译器无法识别它指向对象的类结构,找不到虚函数表,自然无法调用成员函数Foo()。
修正后的代码示例
#include <iostream> // 抽象基类 class Base{ public: virtual int Foo() = 0; // 纯虚函数,定义统一接口 virtual ~Base() = default; // 基类必须加虚析构,避免内存泄漏 }; class Child1: public Base{ public: int Foo() override { std::cout << "Child1::Foo() 被调用" << std::endl; return 1; } }; class Child2: public Base{ public: int Foo() override { std::cout << "Child2::Foo() 被调用" << std::endl; return 2; } }; int main() { Child1 child1; Child2 child2; Base* ptr = nullptr; // 使用基类类型指针 int expression = 1; // 示例值,可按需修改 switch (expression) { case 1: ptr = &child1; break; case 2: ptr = &child2; break; default: std::cout << "无效的表达式值" << std::endl; return 1; } if (ptr != nullptr) { ptr->Foo(); // 自动触发对应子类的函数实现 } return 0; }
关键注意事项
- 必须使用基类指针/引用:只有
Base*类型的指针才能触发多态,编译器会通过虚函数表自动匹配子类的函数实现。 - 基类成员函数需设为public:否则外部无法通过指针调用虚函数。
- 基类必须定义虚析构函数:如果后续用
new创建子类对象并通过基类指针管理,虚析构能确保子类析构函数被正确执行,防止内存泄漏。 - 推荐使用
override关键字:可以让编译器检查子类函数是否正确重写了基类的虚函数,避免签名不匹配或拼写错误。
内容的提问来源于stack exchange,提问作者oretomos
相关产品推荐
相关产品推荐

