首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尝试将基类函数指针指向派生类函数

基类函数指针指向派生类函数是一种多态的实现方式,它允许通过基类的指针或引用调用派生类的函数。这种技术在面向对象编程中非常常见,可以提高代码的灵活性和可扩展性。

在C++中,可以通过虚函数和纯虚函数来实现基类函数指针指向派生类函数的效果。虚函数是在基类中声明并在派生类中重新定义的函数,通过在基类中将函数声明为虚函数,可以使得基类的指针或引用在运行时动态绑定到派生类的函数。

以下是一个示例代码:

代码语言:txt
复制
#include <iostream>

class Base {
public:
    virtual void func() {
        std::cout << "Base::func()" << std::endl;
    }
};

class Derived : public Base {
public:
    void func() override {
        std::cout << "Derived::func()" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    basePtr->func();  // 输出 "Derived::func()"

    delete basePtr;
    return 0;
}

在上述示例中,基类Base中的函数func()被声明为虚函数,并在派生类Derived中重新定义。在main()函数中,通过将派生类对象的地址赋值给基类指针basePtr,可以通过基类指针调用派生类的函数func(),实现了基类函数指针指向派生类函数的效果。

这种技术在实际开发中非常有用,特别是在设计和实现基类和派生类的框架或库时。它可以使得代码更加灵活,可以根据具体的需求动态地选择调用不同的派生类函数。

腾讯云提供了丰富的云计算产品和服务,其中与C++开发相关的产品包括云服务器CVM、容器服务TKE、函数计算SCF等。您可以通过访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于这些产品的详细信息和使用指南。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

派生类多态虚函数

成员函数与继承派生类可以继承其的成员, 然而有时候派生类必须对其重新定义。派生类需要对这些操作提供自己的新定义以覆盖从继承而来的旧定义。...在C++语言中,必须将它的两种成员函数区分开来: 一种是希望其派生类进行覆盖的函数 另一种是希望派生类直接继承而不要改变的函数。 对于前者,通常将其定义为虚函数(virual)。...根据引用或指针所绑定的对象类型不同,该调用可能执行的版本,也可能执行某个派生类的版木,通过在其成员函数的声明语句之前加上关键字virtual使得该函数执行动态绑定。...此外,我们能将公有派生类型的对象绑定到的引用或指针上。 大多数都只继承自一个,这种形式的继承被称作“单继承”。 派生类中的虚函数派生类经常(但不总是)覆盖它继承的虚函数。...晚绑定-》运行阶段确定函数地址 动态多态满足关系: 1.有继承关系 2.子类重写父的虚函数 动态多态使用:父指针或引用 指向子类对象 重写:函数返回值类型 函数名 参数列表 完全一致叫重写

18920
  • c++继承 派生类函数

    1.调用的构造函数 2.调用派生类的构造函数 派生类的析构可想而知: 1.调用派生类的析构函数 2.调用的析构函数  虚函数  如下程序:  class Base { public:     Base...    std::cout << typeid(*pb).name() << std::endl;     pb->Show();     return 0; }  运行结果如下:    上面结果说明一个指针是可以指向派生类对象的...中含有虚函数,那么布局中存在一个虚函数指针指向函数表;且其派生类中与其同名同参的函数不需要加virtual也是虚函数。...此时派生类的布局如下:     vfptr的指针大小为4(32位机器)。因此字节数为8,派生类为12。...首先通过指针指向的对象找到vfptr,再找到vftable,获取到Show函数的入口地址,此时 &Derive::Show中存放的是派生类的虚函数入口地址,因此调用的是派生类中的Show()函数

    1.1K20

    派生类中虚函数和非虚函数的继承效果

    ,在编译阶段就确定好是被谁调用,所以他只认哪个指针指向自己,这里是Animal指针指向,所以他就调用Animal里面的,普通函数是父为子类提供的“强制实现”,也就是只要是父指针调用普通函数,那就是父的普通函数...而虚函数的作用,主要是为了让父指针可以调用子类的函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++的虚函数主要作用是“运行时多态”,父中提供虚函数的实现,为子类提供默认的函数实现。...子类可以重写父的虚函数实现子类的特殊化。 2、纯虚函数:   C++中包含纯虚函数,被称为是“抽象”。抽象不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。   ...3、普通函数:   普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”对象,调用自己的普通函数。   普通函数是父为子类提供的“强制实现”。   ...因此,在继承关系中,子类不应该重写父的普通函数,因为函数的调用至于对象的字面值有关。 参考链接

    8410

    指向函数指针

    当调用一个函数时出了通过函数名来调用之外,还可以通过指向函数指针变量来调用。切记,和一切指针变量一样,一个指向函数指针其初值也不能为空。因为它在使用之前必须被赋予一个真实的地址。...double result = 0.0; 22 result = func1(0.0,1.0); 23 printf("%g\n",result); 24 } 现在改写上面的代码,使用一个指向函数指针变量来调用函数...(2)、(*p)两侧括号不能省,p先与*结合,表面是一个指针变量,在后面的()的内容结合,表示此指针变量指向函数而非变量,如果去掉,如:double *p()表示p()的返回类型是一个指向double型变量的指针...但对于指向函数指针变量,它只能指向函数的入口处而无法指向函数中某条具体的指令,因此,对于p+n,p++等指针运算对于指向函数指针没有意义。...如:double (*p)(double , double); 所以,通过以上的了解,我们知道了指向函数指针的灵活性,一个指针变量可以调用多个不同的函数,这对于程序的优化和简化都起了很大的作用。

    1.3K60

    指向函数指针

    指向函数指针 程序中定义函数后,对程序进行编译时,编译系统为函数分配一段存储空间存储二进制代码,这段内存空间的起始地址(也称入口地址)称为函数指针。...程序中可以定义一个指针变量,用来存放一个函数的起始地址,即该指针变量指向一个函数,称为函数指针变量。...函数指针变量定义的一般形式如下: 类型说明符(*指针变量名)(函数的形参列表); 说明: (1)函数指针变量可以指向函数满足两个条件:函数的返回值由上面“类型说明符”确定;函数的形参列表与上面...int(*pl)(int a, int b); double(* p2)( double x); 其中,函数指针变量pl可以指向返回值类型为int,形参是两个int类型变量的函数;函数指针变量...例如上面两个函数指针变量通常写成如下形式 int(* pl)(int, int ); double(* p2)( double); (2)使用函数指针变量调用函数之前,必须使函数指针变量指向一个函数

    80310

    7.4 指向函数指针

    一、什么是函数指针 解释:存储空间的起始地址(又称入口地址)称为这个函数指针 二、用函数指针变量调用函数 (1)通过函数名调用 (2)通过指针变量访问它所指向函数 三、定义和使用指向函数指针变量...一般形式 类型名(*指针变量名)(函数参数表列) 注意: ①定义指向函数指针变量,并不意味着这个指针变量可以指向任何函数,它只能指向在定义时指定的类型的函数 ②如果要用指针调用函数,必须先使指针变量指向函数...③在给函数的入口地址赋值时,只需给出函数名而不必给出参数 ④用函数指针变量调用函数时,只需将(*p)代替函数名即可,在(*p)之后的括号中根据需要写上实参 ⑤对指向函数指针变量不能进行算术运算 ⑥用函数名调用的函数...,只能调用所指定的一个函数,而通过指针变量调用函数比较灵活,可以根据不同情况先后调用不同的函数 四、用指向函数指针函数参数 指向函数指针变量的一个重要用途是把函数的地址作为参数传递到其他函数

    8453329

    8.5 指向函数指针

    2、可以定义一个指向函数指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向函数。...3、例子 int (*p)(int,int); 定义p是一个指向函数指针变量,它可以指向函数的类型为整型且有两个整型参数的函数。p的类型用int(*)(int,int)表示。...02 用函数指针变量调用函数 如果想调用一个函数,除了可以通过函数名调用以外,还可以通过指向函数指针变量来调用该函数。...2、定义指向函数指针变量,并不意味着这个指针变量可以指向任何函数,它只能指向在定义时指定的类型的函数。 3、如果要用指针调用函数,必须先使指针变量指向函数。...04 用指向函数指针函数参数 1、指向函数指针变量的一个重要用途是把函数的地址作为参数传递到其他函数

    9343029

    虚析构函数? vptr? 指针偏移?多态数组? delete 指针 内存泄漏?崩溃?

    ]))(p, arg-list); 其中p是指针,vptr是p指向的对象的隐含指针,而slotNum 就是调用的虚函数指针在vtable 的编号,这个数组元素的索引号在编译时就确定下来, 并且不会随着派生层的增加而改变...,这是因为我们的析构函数声明为虚函数的原因,在pI 指向派生类首地址的前提下,如果~IRectangle() 是虚函数,那么会找到实际的函数~Rectangle() 执行,而~Rectangle...如果没有这样做的话,只会输出的 析构函数,这种输出情况通过比对规则2也可以理解,pI 现在虽然指向派生类对象首地址,但执行pI->~IRectangle() 时 发现不是虚函数,故直接调用, 假如在派生类析构函数内有释放内存资源的操作...因为此时是空1个字节,派生类有虚函数故有vptr 4个字节,“继承”的1个字节附在vptr下面,现在的p 实际上是指向了附属1字节,即operator delete(void*) 传递的指针值已经不是...析构函数改成虚函数,fun() 最好也改成虚函数,只要有一个虚函数大小就为一个vptr ,此时派生类大小都是4个字节,p也指向派生类的首地址,问题解决,参考规则3。

    1K20

    虚析构函数? vptr? 指针偏移?多态数组? delete 指针 内存泄漏?崩溃?

    五条基本规则: 1、如果已经插入了vptr, 则派生类继承和重用该vptr。...,这是因为我们的析构函数声明为虚函数的原因,在pI 指向派生类首地址的前提下,如果~IRectangle()  是虚函数,那么会找到实际的函数~Rectangle() 执行,而~Rectangle...如果没有这样做的话,只会输出的 析构函数,这种输出情况通过比对规则2也可以理解,pI 现在虽然指向派生类对象首地址,但执行pI->~IRectangle() 时 发现不是虚函数,故直接调用, 假如在派生类析构函数内有释放内存资源的操作...因为此时是空1个字节,派生类有虚函数故有vptr 4个字节,“继承”的1个字节附在vptr下面,现在的p 实际上是指向了附属1字节,即operator delete(void*) 传递的指针值已经不是...析构函数改成虚函数,fun() 最好也改成虚函数,只要有一个虚函数大小就为一个vptr ,此时派生类大小都是4个字节,p也指向派生类的首地址,问题解决,参考规则3。

    96700

    从零开始学C++之继承(二):继承与构造函数派生类的转换

    从输出可以看出: 派生类对象的构造次序: 先调用对象成员的构造函数,接着是的构造函数,然后是派生类的对象成员的构造函数,最后是派生类自身的构造函数。...四、派生类的转换 当派生类以public方式继承时,编译器可自动执行的转换(向上转型 upcasting 安全转换) 派生类对象指针自动转化为对象指针 派生类对象引用自动转化为对象引用...将派生类对象看成对象     //pm = &e1; // 对象指针无法转化为派生类对象指针。...无法对象看成是派生类对象     e1 = m1;    // 派生类对象可以转化为对象。将派生类对象看成对象     // 会产生对象切割(派生类特有成员消失)。...; // 对象无法强制转化为派生类对象     return 0; } 五、派生类的转换 对象指针(引用)可用强制类型转换为派生类对象指针(引用), 而对象无法执行这类转换.

    1.5K00

    函数的返回值指向一个指针

    create_array() 函数接收一个整数 n,然后动态分配了一个 n 个元素的整型数组,数组中的每个元素初始化为其下标值,最后指向数组的指针作为函数的返回值返回。...在调用 apply() 函数时,一个名为 print() 的函数指针作为参数传递给它,这个函数会将整型参数打印到标准输出中。...函数指针是指一个指向函数指针变量,它存储了函数的地址,可以用来调用函数函数指针的定义方式与普通的指针定义方式相似,只是需要在指针类型前面加上函数的返回类型和参数列表。...在 main() 函数中, p 指向 add() 函数,并调用它来完成加法操作,然后再将 p 指向 subtract() 函数,并调用它来完成减法操作。 函数里面的参数可以传递一个指针进来。...指针作为参数传递进函数时,实际上传递的是指针指向的内存地址,函数可以通过指针来访问、修改指针指向的内存中的数据。 定义了一个名为 swap() 的函数,它有两个参数,都是指向整型变量的指针

    69020

    【C++】多态 ⑧ ( 验证指向函数表 的 vptr 指针 | 对比定义了虚函数和没有定义虚函数的大小 )

    对比 定义了 虚函数 与 没有定义虚函数 的大小 , 其它成员都相同 , 定义了虚函数多出了 4 字节 , 多出的 4 字节就是 vptr 指针占用的内存空间 ; 一、验证指向函数表...1 个虚函数 ; 如果 没有虚函数 , 就不会生成虚函数表 ; 如果 中有 virtual 虚函数 , 则 该类的 每个对象 中 , 都有一个 指向函数表的 vptr 指针 ; 虚函数表 存储...虚函数指针 : " 虚函数表 " 是 存储 " 成员函数指针 " 的 数据结构 , 是一个 函数指针数组 , 数组中的元素都是函数指针 , 具体存储的都是 指向 中的虚函数指针 ; 如果 子类...会生成 虚函数表 Virtual Function Table , 简称 vtable ; C++ 编译器 编译 代码时 , 会自动为该类 添加 一个 vptr 指针 成员变量 , 该指针指向函数表...vptr 指针指向函数表 首地址 Child c; // 指针指向子类对象 p = &c; // 通过父指针调用子类对象的 fun 函数 p->fun(1); // 打印

    21240

    202453学习笔记:派生类的默认成员函数

    要明确的是,继承关系里,先有父派生类才能去继承,所以派生类的构造函数必须要遵守先父后子的原则,必须调用的构造函数初始化的那一部分成员。...如果没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。 2.拷贝构造 派生类的拷贝构造函数必须调用的拷贝构造完成的拷贝初始化。...和构造函数原则一样,如果没有默认的拷贝构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。...此外,父的赋值重载会和派生类的赋值重载构成隐藏,因此使用时要注意 三.析构函数 派生类的析构函数会在被调用完成后自动调用的析构函数清理成员。...四.总结 构造函数的规则一般都于析构函数相反,.派生类对象初始化先调用构造再调派生类构造, 派生类对象析构清理先调用派生类析构再调的析构。

    8910
    领券