二,哪些函数不能成为虚函数?
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修饰,就不是虚函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)