C++virtual函数重写,在继承的时候没有写关键字也仍然是虚函数吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++virtual函数重写,在继承的时候没有写关键字也仍然是虚函数吗?相关的知识,希望对你有一定的参考价值。

#include<iostream>
using namespace std;

class A

public:
virtual void f1();
virtual void f2(int);
;

class B :public A

public:
virtual void f1();
void f2(int);
;

class C :public B

public:
virtual void f1();
virtual int f3();
;
为什么类B里的f2函数还是虚函数,不是覆盖了吗?如果不是该怎么解释f2函数仍是虚函数?

父类定义成虚函数,子类中和父类虚函数相同名称,参数表相同的函数会自动变成虚函数。不管加没有virtual 参考技术A 如果基类声明了一个函数为虚函数
那么派生类里重写这个函数且函数名 参数 返回值什么都不变的话会默认为虚函数
参考技术B 会自动继承virtual属性。还是虚函数。

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

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

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

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

追答

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

追问

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

追答

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

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

追答

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

以上是关于C++virtual函数重写,在继承的时候没有写关键字也仍然是虚函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

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

绝不又一次定义继承而来的函数的缺省參数值

c#基础 继承和接口,扩展类型

virtual这个关键字有啥用

转载 [c#] 虚函数(Virtual),抽象函数(abstract)和接口的区别

虚函数