虚函数与纯虚函数
作者:互联网
-
1、纯虚函数声明如下: virtual void funtion1()=0;
纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。 -
2、虚函数声明如下:virtual ReturnType
FunctionName(Parameter);虚函数必须实现,如果不实现,编译器将报错,错误提示为: error LNK****:
unresolved external symbol “public: virtual void __thiscall
ClassName::virtualFunctionName(void)” -
3、对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。
-
4、实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。
-
5、虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。
-
6、在有动态分配堆上内存的时候,析构函数必须是虚函数,但没有必要是纯虚的。
-
7、友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。
-
8、析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。
有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。定义纯虚函数就是为了让基类不可实例化化, 因为实例化这样的抽象数据结构本身并没有意义. 或者给出实现也没有意义
实际上我个人认为纯虚函数的引入,是出于两个目的,
1、为了安全.因为避免任何需要明确但是因为不小心而导致的未知的结果.提醒子类去做应做的实现。
2、为了效率,不是程序执行的效率,而是为了编码的效率。
#include <iostream>
using namespace std;
class base{
public:
virtual void f(){
cout << "i am base f" << endl;
}
void g(){
cout << "i am base g" << endl;
}
void y(){
cout << "i am base y" << endl;
}
};
class base2{
public:
virtual void f(){
cout << "i am base2 f" << endl;
}
void g(){
cout << "i am base2 g" << endl;
}
void y(){
cout << "i am base2 y" << endl;
}
};
class Child final:public base, public base2{
public:
void f(){
cout << "i am child f" << endl;
}
void g(){
cout << "i am child g" << endl;
}
void m(){
cout << "i am child m" << endl;
}
};
class vbase{
public:
virtual void f()=0;
virtual void g(){
cout << "i am vbase g" << endl;
};
};
class vchild: public vbase{
public:
virtual void f(){
cout << "i am vchild f" << endl;
}
};
int main() {
Child a;
base *p = &a;
base2 *p2 = &a;
Child *q = &a;
p->f();
p->g();
//p->m(); //非法访问,父类不能访问子类没有重写的函数,尽管在虚函数表中有子类自有函数的地址。
p2->f();
p2->g();
q->f();
q->g();
q->base::y(); // 添加操作域
q->base2::y(); // 添加操作域
//纯虚函数
cout << "\n\nvbase" << endl;
vbase *va = new vchild();
va->g();
va->f();
return 0;
}
输出:
i am child f
i am base g
i am child f
i am base2 g
i am child f
i am child g
i am base y
i am base2 y
vbase
i am vbase g
i am vchild f
标签:cout,子类,void,am,纯虚,函数 来源: https://blog.csdn.net/XianAnn/article/details/121077382