首页 > 编程语言 > 详细

C++学习1——virtual关键字

时间:2021-06-27 13:34:57      阅读:16      评论:0      收藏:0      [点我收藏+]

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

 

C++学习1——virtual关键字

原文:https://www.cnblogs.com/UTix/p/14940055.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!