关于继承这一章

2019-03-20  本文已影响0人  sgy1993

如果没有关键字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,不能实现多态

上一篇下一篇

猜你喜欢

热点阅读