0.virtual作用
在进行类的继承的时候所有被virtual关键字修饰父类的函数都会被子类继承,在子类中也可以对该函数进行重写。对继承函数的重写也是C++多态的体现之一,需要注意的是C++为继承提供了选项,默认情况下是private。
1.虚函数
虚函数是一种特殊的函数,当我们使用virtual修饰一个类方法时,他就成为了一个虚函数,虚函数允许子类对其进行重写以实现不同的函数效果,我们常使用virtual修饰析构函数以防止内存问题。
下面是一个虚函数实例,我们可以看到test_override继承并重写了父类test_virtual中的PrintClassName方法,同时test_twice_override也可以重写,值得注意的是,在当前书写情况下,我还不知道其究竟重写的是test_virtual中的方法还是test_override中的方法,但这无伤大雅,反正都是重写。
另外重写时最好加上override,这样可以方便我们对代码进行debug。
#include <iostream> class test_virtual{ public: virtual void PrintClassName(){ std::cout<<"test_virtual"<<std::endl; } }; class test_override : public test_virtual{ public: virtual void PrintClassName() override{ std::cout<<"test_override"<<std::endl; } }; class test_twice_override : public test_override{ public: virtual void PrintClassName() override{ std::cout<<"test_twice_override"<<std::endl; } }; void test(test_virtual *temp){ temp->PrintClassName(); } int main(){ test_virtual *a=new test_virtual(); test_override *b=new test_override(); test_twice_override *c=new test_twice_override(); a->PrintClassName(); b->PrintClassName(); c->PrintClassName(); test(a); test(b); test(c); return 0; }
结果如下
test_virtual
test_override
test_twice_override
test_virtual
test_override
test_twice_override
2.纯虚函数
纯虚函数与虚函数的区别在于纯虚函数没有函数体而是用=0进行代替,纯虚函数会强制子类对其进行重写。
纯虚函数往往被用于定义接口类,接口类就是提供子类方法书写参考的一种类。下面是一个接口类的例子,值得注意的是我们无法创建一个接口类实例。同时接口类往往与多继承相关,下面也展示了多继承。
#include <iostream> class test_pure_virtual{ public: virtual void print_class_name()=0; }; class test_multiextends{ public: virtual void helloworld(){ std::cout<<"helloworld"<<std::endl; } }; class test_pure_virtual_example :public test_pure_virtual ,public test_multiextends{ public: void print_class_name() override{//必须重写 std::cout<<"test_pure_virtual_example"<<std::endl; } }; int main(){ //test_pure_virtual *a=new test_pure_virtual();不允许 test_pure_virtual_example *b=new test_pure_virtual_example(); b->print_class_name(); b->helloworld(); return 0; }
运行结果如下:
test_pure_virtual_example
helloworld
原文:https://www.cnblogs.com/UTix/p/14940055.html