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

使用C++中的私有函数覆盖公共虚函数

在C++中,私有函数不能覆盖公共虚函数。这是因为私有函数只能在类内部访问,而虚函数需要在派生类中进行重写。如果私有函数覆盖了公共虚函数,那么派生类将无法访问这个私有函数,从而无法重写它。这违反了C++的访问控制规则。

如果您想要在派生类中重写一个虚函数,那么这个函数必须是公共的。这是因为派生类需要访问这个函数,并且需要重写它。如果这个函数是私有的,那么派生类将无法访问它,从而无法重写它。

如果您想要在派生类中重写一个虚函数,并且同时不想让其他类访问这个函数,那么您可以将这个函数声明为受保护的(protected)。这样,派生类可以访问这个函数,并且重写它,但是其他类将无法访问它。

总之,私有函数不能覆盖公共虚函数,因为私有函数只能在类内部访问,而虚函数需要在派生类中进行重写。如果您想要在派生类中重写一个虚函数,那么这个函数必须是公共的。如果您想要在派生类中重写一个虚函数,并且同时不想让其他类访问这个函数,那么您可以将这个函数声明为受保护的(protected)。

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

相关·内容

C++ 多态: 虚函数: 纯虚函数:(java中抽象函数) C++纯虚函数相当于Java中的抽象函数区别:

虚函数: 虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。...C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。   ...C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   C++中的纯虚函数也是一种“运行时多态”。   ...C++纯虚函数相当于Java中的抽象函数区别: java中的抽象函数是只有函数声明,没有方法体。...而c++中的纯虚函数是可以有方法体,也就是说是可以给出定义的,并且,在c++中,子类还可以调用父类的纯虚函数

12210

C++的虚函数与纯虚函数

C++的虚函数是一种特殊的成员函数,用于实现多态性。虚函数允许在基类中声明一个函数,在派生类中根据需要进行重写,并通过基类指针或引用来调用派生类对象的特定实现。...①虚函数的声明 在基类中,我们可以使用关键字virtual来声明一个虚函数。...ptr->show(); ③派生类重写虚函数 派生类可以重写基类中的虚函数,以提供自己的实现。...." << endl; } }; ④纯虚函数 虚函数也可以被声明为纯虚函数,即没有默认实现的虚函数。纯虚函数通过在声明中使用= 0来标识。...虚函数使用动态绑定,即运行时将根据对象的实际类型选择正确的函数实现。 构造函数不能是虚函数。 静态成员函数不能是虚函数。 虚函数可以被继承,派生类可以选择是否重写虚函数。

23010
  • 干货丨C++中的虚函数

    比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使用方法,不做过多的阐述。大家可以看看相关的C++的书籍。...我们从表中可以看到下面几点, 1)覆盖的f()函数被放到了虚表中原来父类虚函数的位置。 2)没有被覆盖的函数依旧。...多重继承(无虚函数覆盖) 下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系。注意:子类并没有覆盖父类的函数。 ? 对于子类实例中的虚函数表,是下面这个样子: ?...下图中,我们在子类中覆盖了父类的f()函数。 ? 下面是对于子类实例中的虚函数表的图: ? 我们可以看见,三个父类虚函数表中的f()的位置被替换成了子类的函数指针。...编译出错 任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法,所以,这样的程序根本无法编译通过。

    60341

    C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别

    https://blog.csdn.net/jxq0816/article/details/82625408 1.虚函数(impure virtual)   C++的虚函数主要作用是“运行时多态...; } }; 2.纯虚函数(pure virtual)        C++中包含纯虚函数的类,被称为是“抽象类”。...抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。   C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   ...C++中的纯虚函数也是一种“运行时多态”。   ...普通函数是父类为子类提供的“强制实现”。   因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。

    2K30

    【c++】多态&&虚函数&&抽象类&&继承中的虚函数表详解

    ::Func1,所以虚函数的重写也叫作覆盖,覆盖就是指虚表中虚函数的覆盖。...nullptr 总结一下派生类的虚表生成:a.先将基类中的虚表内容拷贝一份到派生类虚表中 b.如果派生类重写了基类中某个虚函数,用派生类自己的虚函数覆盖虚表中基类的虚函数 c.派生类自己新增加的虚函数按其在派生类中的声明次序增加到派生类虚表的最后...的虚表中 找到虚函数是Student::BuyTicket 这样就实现出了不同对象去完成同一行为时,展现出不同的形态 反过来思考我们要达到多态,有两个条件,一个是虚函数覆盖,一个是对象的指针或引用调用虚函数...下面我们使用代码打印 出虚表中的函数 typedef void(*VFPTR) (); void PrintVTable(VFPTR vTable[]) { // 依次取虚表中的虚函数指针打印并调用。...所以菱形继承、菱形虚拟继承我们的虚表我们就不看了,一般我们也不需要研究清楚,因为实际中很少用 C++ 虚函数表解析 | 酷 壳 - CoolShell C++ 对象的内存布局 | 酷 壳 - CoolShell

    38510

    C++不要在构造函数和析构函数中调用虚函数

    虽然可以对虚函数进行实调用,但程序员编写虚函数的本意应该是实现动态联编。在构造函数中调用虚函数,函数的入口地址是在编译时静态确定的,并未实现虚调用。...但是为什么在构造函数中调用虚函数,实际上没有发生动态联编呢? 1. 不要在构造函数中调用虚函数的原因 第一个原因,在概念上,构造函数的工作是为对象进行初始化。...在Visual C++中,包含虚函数的类对象的虚指针被安排在对象的起始地址处,并且虚函数表(vtable)的地址是由构造函数写入虚指针的。...2.不要在析构函数中调用虚函数的原因 同样的,在析构函数中调用虚函数,函数的入口地址也是在编译时静态决定的。也就是说,实现的是实调用而非虚调用。 考察如下例子。...b退出作用域时,会先调用类B的析构函数,然后调用类A的析构函数,在析构函数~A()中,调用了虚函数show()。

    3.8K30

    C++多态的传递性和虚函数的重载之重写的虚函数还可以是虚函数

    C++的多态特性是面向对象编程中的一个重要概念,它允许我们将子类对象当作父类对象来使用。这种特性的实现主要依赖于虚函数和虚函数表。...在C++中,多态是可以传递的。...虽然b的类型是Base*,但是它实际上指向的是Derived对象,因此调用的是Derived类的foo函数。 虚函数的重载 在C++中,虚函数可以在子类中被重载。...也就是说,子类可以提供一个与父类虚函数同名的函数,这个函数将覆盖父类的虚函数。 在上述代码中,Derived类、DerivedBase类和Base类都有一个名为foo的虚函数。...理解这些概念,可以帮助我们更好地使用C++,编写出更高质量的代码。

    9810

    C++中虚函数多态实现的原理刨析

    ,因此如国不写virtual,与父类里面speak同名的函数也会默认为虚函数 virtual void speak() { cout << "小猫在说话" << endl; } }; void...在深入探究多态实现原理前,先要理解多态的意思和虚函数实现的条件 多态: 不同类的对象对同一消息的不同响应 注意: 虚函数实现条件 : 1.有继承关系 2.子类重写父类的虚函数 动态多态的使用...: 父类的指针或者引用指向子类的对象 多态实现的原理探究: 未写虚函数前: #include using namespace std; class Animal { public:...未写虚函数前,空对象a的大小为1,写了虚函数后,对象a的大小为4,是因为此时a里面存放了一个vfptr虚函数(表)指针,指针大小无论类型均为4个字节大小 该虚函数指针指向一个虚函数表 当子类未重写父类虚函数时...当发生虚函数重写时,子类会把自己的虚函数覆盖掉之前父类的虚函数 因此当父类的指针或者引用指向子类对象的时候,会发生多态,你传入的是cat对象,就去cat的虚函数表中找speak函数的入口地址

    46010

    C++之虚函数的作用和使用方法

    这就是通过同一种形式能达到不同目的的例子。 C++中的虚函数就是用来解决这个问题的。...虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。 请分析例12.2。这个例子开始时没有使用虚函数,然后再讨论使用虚函数的情况。...由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同的响应。 虚函数的使用方法是: 在基类用virtual声明成员函数为虚函数。...C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。...通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。 通过虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类的同名函数,只要先用基类指针指向即可。

    1.4K80

    《挑战30天C++入门极限》C++中类的多态与虚函数的使用

    C++中类的多态与虚函数的使用   类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持面向对象的...+中是允许派生类重载基类成员函数的,对于类的重载来说,明确的,不同类的对象,调用其类的成员函数的时候,系统是知道如何找到其类的同名成员,上面代码中的a.ShowMember();,即调用的是Vehicle...但是在实际工作中,很可能会碰到对象所属类不清的情况,下面我们来看一下派生类成员作为函数参数传递的例子,代码如下: //例程2 #include using namespace...对象a与b分辨是基类和派生类的对象,而函数test的形参却只是Vehicle类的引用,按照类继承的特点,系统把Car类对象看做是一个Vehicle类对象,因为Car类的覆盖范围包含Vehicle类,所以...Vehicle(speed,total) { Car::aird = aird; } virtual void ShowMember()//虚函数

    70510

    C++中函数重载、隐藏、覆盖和重写的区别

    3.1定义 派生类中与基类同返回值类型、同名和同参数的虚函数重定义,构成虚函数覆盖,也叫虚函数重写。 关于返回值类型存在一种特殊情况,即协变返回类型(covariant return type)。...如果派生类中定义了一个与基类虚函数同名但参数列表不同的非virtual函数,则此函数是一个普通成员函数(非虚函数),并形成对基类中同名虚函数的隐藏,而非虚函数覆盖(重写)。...《C++高级进阶教程》中认为函数的隐藏与覆盖是两个不同的概念。隐藏是一个静态概念,它代表了标识符之间的一种屏蔽现象,而覆盖则是为了实现动态联编,是一个动态概念。...例如,可以对虚函数采用“实调用”,即尽管被调用的是虚函数,但是被调用函数的地址还是在编译阶段静态确定的,那么派生类中的虚函数仍然形成对基类中虚函数的同名隐藏。...C++中函数重载隐藏和覆盖的区别,并不难,难就难在没弄清定义,被网上各种说法弄的云里雾里而又没有自己的理解。

    8.3K62

    【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)

    虚函数的重写:也叫做覆盖,当派生类中有一个与基类完全相同(返回值类型、参数列表、函数名都相同)的虚函数时(注意基类中的这个函数也是虚函数),称派生类的该虚函数重写(覆盖)了基类的相应虚函数。...运行结果: 结论:基类当中的析构函数建议设计为析构函数。 2.5 c++11关键字:override和final 不难发现,c++对虚函数重写的要求十分严格。...如果派生类重写了基类的虚函数,那么派生类的虚函数表中对应的虚函数地址就会被覆盖成重写的新虚函数地址。 4....派生类的虚函数表包含三个部分:基类的虚函数地址、由于派生类重写而覆盖的虚函数地址、派生类自己的虚函数地址。 5. c++标准并没有规定虚函数表位于内存哪一个区域,vs下默认位于代码段。 2....多态的实现过程 总的来说,多态的实现过程是:首先根据规则创建虚函数表,在虚函数表中存储相应的虚函数地址,然后在基类和派生类中添加虚函数表指针,最后通过指向的虚函数表来调用相应的虚函数或重写函数

    31021
    领券