You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:53:20