C++:多态virtual虚函数本质

一:什么是多态

多态:多种形态!
C++ 多态调用成员函数时,根据调用函数的对象类型执行不同的函数。

#include 
class Animal {
public:
    int age() {
        std::cout << "Animal age \n";
        return 0;
    }
};

class Dog: public Animal {
public:
    int age () {
        std::cout << "Dog age \n";
        return 0;
    }
};

class Cat: public Animal {
public:
    int age () {
        std::cout << "Cat age \n";
        return 0;
    }
};

int main(int argc, const char * argv[]) {
    Animal *animal;
    Dog dog;
    animal = &dog;
    animal->age();
    
    Cat cat;
    animal = &cat;
    animal->age();
    return 0;
}

// print 
Animal age 
Animal age 

子类重写了age()方法,但是并没有调用子类的age()实现,而是调用了父类的age()实现,

此时如果在age()方法前面加上virtual

class Animal {
public:
    virtual int age() {
        std::cout << "Animal age \n";
        return 0;
    }
};

//
class Animal {
public:
    virtual int age() = 0; // = 0 说明函数没有主体,是虚函数。
};

就会打印

Dog age 
Cat age 

这里父类方法添加了virtual,子类就会调用自己的实现,这就是多态

二:虚函数(virtual)为什么能实现多态

普通的函数是静态链接 ,是一种早绑定,程序执行前,编译器已经将函数调用规定好了,也就是说函数在程序编译期间就已经确定好了。

虚函数: 添加了关键字 virtualvirtual 声明的函数,在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。我们想要的是在程序中运行时可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定

virtual int age() = 0;这种方式声明的虚函数,子类必须实现该方法

你可能感兴趣的:(C/C++,c++,多态)