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

父类类型指针调用子类成员函数失败原因咨询

C++基类指针无法调用派生类独有成员函数的原因

我正在学习面向对象编程,编写了如下C++程序,但不理解为何调用b->derived_function();失败。我知道基类Base没有该名称的成员函数,但我执行了b = new Derived();,b指向的是Derived类实例,为何无法调用该函数?

#include <iostream>
using namespace std;

class Base {
public:
    virtual void base_function() = 0;
};

class Derived: public Base {
public:
    void base_function() {
        cout<<"base_function"<<"\n";
    }

    void derived_function() {
        cout<<"derived_function"<<"\n";
    }   
};

int main() {
    Base* b;
    b = new Derived();
    
    // b->base_function();  //可正常运行
    b->derived_function();  //无法运行,原因是什么?
    
    return 0;
}

原因解析

这是C++静态类型检查机制导致的:

  • 变量b的静态类型是Base*,编译器在编译阶段只会依据这个静态类型校验成员函数的可用性,完全不考虑它实际指向的对象是Derived类型。由于Base类中并没有声明derived_function,所以编译直接报错。
  • 动态多态(通过虚函数实现)仅对基类中已声明的虚函数生效,比如你注释掉的base_function()——它是基类的纯虚函数,派生类重写后,基类指针调用时会动态绑定到派生类的实现,但这个特性只适用于基类已声明的成员。

解决方法

如果需要调用派生类的独有函数,有两种常用方案:

  1. 安全类型转换:将基类指针转换为派生类指针,推荐使用dynamic_cast确保转换安全性(转换失败会返回nullptr):
Derived* d = dynamic_cast<Derived*>(b);
if (d != nullptr) {
    d->derived_function();
}
  1. 基类声明虚函数:如果derived_function是所有派生类都应具备的行为,可以在基类中将其声明为虚函数(甚至纯虚函数),让派生类各自实现:
class Base {
public:
    virtual void base_function() = 0;
    virtual void derived_function() = 0; // 声明为纯虚函数
};

内容的提问来源于stack exchange,提问作者R Karandikar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:02:25