美文网首页
关于继承这一章

关于继承这一章

作者: sgy1993 | 来源:发表于2019-03-20 21:17 被阅读0次

    如果没有关键字virtual 程序将根据引用类型或者指针类型选择方法,如果使用了virtual,则将根据引用或指针指向的对象的类型来选择方法
    下面是一个不加virtual的例子

    #include <iostream>
    #include <stdio.h>
    class sgy {
    public:
        void print_some() {
            printf("sgy\n");
        }
    };
    
    class sgy_child : public sgy {
    public:
        void print_some() {
            printf("sgy_child\n");
        }
    };
    int main()
    {
        sgy_child sgy_child1;
        sgy &sgy1 = sgy_child1;
        //sgy *sgy1 = &sgy_child1
        sgy1.print_some();//这个会调用那个函数呢?
        return 0;
    }
    

    输出结果是, sgy1是 class sgy类型的所以他调用的是sgy的print_some函数

    根据引用的类型来决定调用函数

    root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test# ./test
    sgy
    root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test#
    

    如果是改成下面的这个呢?


    image.png

    输出结果如下

    root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test# ./test
    sgy_child
    root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test#
    

    加上virtual之后,则是根据引用对象的类型来决定调用什么函数

    另外一定是父类,或者叫基类加上virtual才管用,派生类单独加上virtual是不管用的,即没有多态

    即如果是下面这样


    image.png

    输出的结果是

    root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test# ./test
    sgy
    root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test#
    

    所以不加父类不加virtual,一定要是基类,否则子类有virtual,不能实现多态

    相关文章

      网友评论

          本文标题:关于继承这一章

          本文链接:https://www.haomeiwen.com/subject/jekxvqtx.html