C++ 怎样禁止子类重写父类的某个虚函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 怎样禁止子类重写父类的某个虚函数?相关的知识,希望对你有一定的参考价值。

例如: class A
virtual int SayHello()...;
class B:public A
virtual int SayHello()...;

class C:public B
此时希望class C在语法上不允许改写SayHello方法,有谁知道怎么做?
有懂的大牛木?

不可能的事。
只要在A类中定义SayHello的时候加了virtual,那么SayHello就永远是个virtual函数,不管继承多少层、加不加virtual。
而子类怎么改写父类的函数,父类完全干涉不了。所以无法阻止C改写B的SayHello。
除非你把B类做成一个不允许其他类继承的类。
参考技术A C++11 提供指示字final,用来避免类型被继承,或是基底类型的函数被改写
class B:public A
virtual int SayHello() fianl ...;
gcc4.7没问题,
vs2010好像不行,不识别final
vs2012没有试,需要win7/8本回答被提问者采纳

C++ 中,类的继承:父类当使用虚函数时候,子类对该函数进行重写的话,属于子类成员函数对虚函数的覆盖!

请问这里的覆盖是什么意思?是不是说子类对象中没有继承父类的虚函数?或者说是继承来了之后,被覆盖了,也就是彻底没了,这样理解可以吗

可以这么理解。
换句话说,你调用子类的虚函数,程序会运行你重写的代码,而不是定义在父类里的代码。追问

但是我子类里面不是虚函数,只是普通的成员函数

追答

没事,只要父类里是虚函数,子类里的同名函数都是虚函数,即使你没写virtual。

追问

我一直以为覆盖就是子类对象中没有了父类的成员函数,假设父类是A,子类的对象是bb,那么我采用aa.A::fun(),是可以运行父类的成员函数的呀,这不就和刚才的那个理解相悖了嘛 怎么解释

追答

因为父类的成员函数还是存在的啊。我不知道你说的对象中有函数是什么意思,函数的代码并不是储存在对象中,对象查找虚函数是通过虚函数表来找到相应函数的地址来实现调用的,而你所说的aa.A::fun()则是跳过了虚函数表直接找到A类fun()函数的地址来调用它。

参考技术A 有没有代码,你这样我也看不懂!追问

追答

子类的virtual可以省略!是有虚函数的!

以上是关于C++ 怎样禁止子类重写父类的某个虚函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++子类如何调父类的虚函数

C++编程中 子类(派生类)能不能重写父类(基类)的函数(方法),除了虚函数?

关于C++的虚函数在父类的内部调用

C++中父类和子类的成员函数同名同参数同返回只是父类里面是虚函数,子类没有虚函数限定 有问题吗

c++中的虚函数

继承与多态C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态