C++ 中什么样的函数可以作为虚函数

C++ 中什么样的函数可以作为虚函数,第1张

二,哪些函数不能成为虚函数?

1内联函数:我们都知道内联函数只是在函数调用点将其展开,它不能产生函数符号,所以不能往虚表中存放,自然就不能成为虚函数。

2静态函数:定义为静态函数的函数,这个函数只和类有关系,它不完全依赖于对象调用,所以也不能成为虚函数。

3构造函数:都知道只有当调用了构造函数,这个对象才能产生,如果把构造函数写成虚函数,这时候我们的对象就没有办法生 成。更别说用对象去调用了。所以构造函数不能成为虚函数。

4友元函数:友元函数不属于类的成员函数,不能被继承。对于没有继承特性的函数没有虚函数的说法。

5普通函数:普通函数不属于成员函数,是不能被继承的。普通函数只能被重载,不能被重写,因此声明为虚函数没有意义。因为编译器会在编译时绑定函数。

三,哪些函数可以成为虚函数呢?

1普通的成员方法是可以成为虚函数的

2还有析构函数,因为析构函数是为了释放对象的,所以之前我们的对象已经生成,而且析构函数可以取地址,所以可以成为虚函数。

————————————————

版权声明:本文为CSDN博主「u010765526」的原创文章,遵循CC 40 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blogcsdnnet/u010765526/article/details/106752135/

纯虚函数就是“强制”要求在派生出具体类的时候 必须定义出的函数,否则该派生类就无法定义具体对象 而虚函数则可重新定义也可以不重新定义

--说得对。

而仅仅站在使用的角度去说,虚函数和纯虚函数都可以实现多态的功能。

--说得对。

派生类如果继承了抽象基类中的纯虚函数,而在该派生类中没有对此纯虚函数进行定义 则该派生类扔为抽象类 不能用它实体定义对象

--说得对。

我的问题是:该派生类继承过来的纯虚函数在这个派生类中扔然为纯虚函数么??????

--说得对。

书上说不是除非重新声明成纯虚函数那是什么?虚函数??我又没有在这个派生类中具体定义继承过来的这个纯虚函数 为什么就不是纯虚函数了呢????

--其实,如果你不打算在某个派生类里实现基类的纯虚函数,那你最好连声明都别声明。如果声明了,那就加上=0。

如果不声明=0,编译器会将它视为非纯虚函数。

例如,基类Base有纯虚方法void Fun()=0

class C1: public Base

{

public: void Fun(); // 不写=0,也不写实现。

}

class C2: public C1

{

public: void Fun(){return;} //有实现了

}

这时你将无法实例化C2,因为C1的非纯虚函数没有实现,将产生连接错误。

Base p = new C2;

C1 p1 = new C2;

C2 p2 = new C2;

这些都无法连接成功。

c++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此,在子类重新声明该虚函数时,可以加,也可以不加,但习惯上每一层声明函数时都加virtual,使程序更加清晰。

选项B是正确的。

其实判断是否是虚函数并不难。

有virtual关键字修饰的函数就是虚函数,没有virtual关键字修饰的就不是虚函数。

class A{

public:

virtual void func1(){ } //虚函数

void func2(){ } //不是虚函数

};

class B:public A{

public:

void func1(){cout<<”class B func1”<<endl;} //不是虚函数

virtual void func2(){cout<<”class B func2”<<endl;} //虚函数 };

这个问题之外的小知识:

1,虚函数的本质是能实现动态绑定,和能否继承无关。

2,虚函数的"特质"是不能继承的。

例如:A::func1()是虚函数,但是B类的func1()没有virtual修饰,就不是虚函数。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12184556.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存