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

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

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

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

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

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

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

相关·内容

C++函数与纯函数

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

17410

干货丨C++函数

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

56041

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

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

1.2K30

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

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

32310

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

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

2.8K30

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函数入口地址

44210

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()//函数

68910

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

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

7.7K62

C++编程经验(4):不要在构造函数和析构函数使用函数

---- 构造函数调用函数 首先构造函数不能调用函数,不是说语法不允许,最重要原因在于,当有继承时候,父类会调用到子类函数,但是此时子类并没有初始化,会导致数据错误,就这一点足已让你不能在构造函数调用函数...在基类构造过程函数调用从不会被传递到派生类。代之是,派生类对象表现出来行为好象其本身就是基类型。不规范地说,在基类构造过程函数并没有被"构造"。...如果在基类构造过程函数调用传递到了派生类, 派生类对象当然可以参照引用局部数据成员,但是这些数据成员其时尚未被初始化。这将会导致无休止未定义行为和彻夜代码调试。...---- 析构函数调用函数 在对象析构期间,存在与上面同样逻辑。一旦一个派生类析构器运行起来,该对象派生类数据成员就被假设为是未定义值,这样以来,C++就把它们当做是不存在一样。...一旦进入到基类析构器,该对象即变为一个基类对象,C++各个部分(函数,dynamic_cast运算符等等)都这样处理。

1.1K30

C++ 构造函数与析构函数调用函数注意事项

虽然可以对函数进行实调用,但程序员编写函数本意应该是实现动态联编。在构造函数调用函数函数入口地址是在编译时静态确定,并未实现调用。...在Visual C++,包含函数类对象指针被安排在对象起始地址处,并且函数表(vtable)地址是由构造函数写入指针。...同样,在析构函数调用函数函数入口地址也是在编译时静态决定。也就是说,实现是实调用而非虚调用。 考察如下例子。...b退出作用域时,会先调用类B析构函数,然后调用类A析构函数,在析构函数~A(),调用了函数show()。...因此,一般情况下,应该避免在构造函数和析构函数调用函数,如果一定要这样做,程序猿必须清楚,对函数调用其实是实调用。

91710

多态析构函数

为什么析构函数要声明成virtual呢? 因为,如果delete一个基类指针时, 如果它指向是一个子类对象,那么析构函数不为就会导致无法调用子类析构函数,从而导致资源泄露。...如果一个类要被使用成多态,那么这个virtual是必须。...去掉析构函数virtual属性后,因为该类没有其他virtual函数,所以编译时不会生成v-table,这样就节省了编译时间,并减少了最终生成程序大小。...并没有这个virutal构造函数。...如果是,则调用: delete this; 因为Release()是virtual,所以该COM对象对应正确派生类被调用,delete this会调用正确析构函数,达到了使用virtual析构函数效果

75660
领券