多态、虚函数、虚函数表

2019-10-11  本文已影响0人  叶子扬
C++.png

多态

虚函数

虚表

虚函数的实现原理是虚表,这个虚表里面存储着最终需要调用的虚函数地址,这个虚表也叫虚函数表


struct Animal {
    int m_age;
    virtual void speak(){
        cout << "Animal::speak()" << endl;
    }
    virtual void run(){
        cout << "Animal::run()" << endl;
    }
};

struct Cat:  Animal {
    int m_life;
    virtual void speak(){
        cout << "Cat::speak()" << endl;
    }
    virtual void run(){
        cout << "Cat::run()" << endl;
    }
};

int main() {
    Animal *cat =new Cat();
    cat->speak();
    cat->run();
    
    return 0;
}
// log:
Cat::speak()
Cat::run()

注意,一定要指针,如果是对象,就失灵了。多态的三要素缺一不可。

int main() {
    Animal cat = Cat();
    cat.speak();
    cat.run();
    
    return 0;
}
// log:
Animal::speak()
Animal::run()

虚表(x86环境的图)

调用父类的成员函数实现

class Animal {
public:
    virtual void speak(){
        cout << "Animal::speak()" << endl;
    }
};

class Cat: public Animal {
public:
     void speak(){
        Animal::speak();
        cout << "Cat::speak()" << endl;
    }
};

int main() {
    Animal cat = Cat();
    cat.speak();
    
    return 0;
}
// log:
Animal::speak()

Q:为啥不继续执行下面的代码
A:上面不是多态

int main() {
    Animal *cat = new Cat();
    cat->speak();
    
    return 0;
}
// log:
Animal::speak()
Cat::speak()

虚析构函数

class Animal {
public:
    virtual void speak(){
        cout << "Animal::speak()" << endl;
    }
    virtual ~Animal(){
        cout << "Animal::~Animal()" << endl;
    }
};

class Cat: public Animal {
public:
     void speak(){
        Animal::speak();
        cout << "Cat::speak()" << endl;
    }
    
    ~Cat(){
        cout << "Animal::~Cat()" << endl;
    }
};

int main() {
    Animal *cat = new Cat();
    cat->speak();
    
    return 0;
}

// log:
Animal::speak()
Cat::speak()

Q:为啥不析构
上一篇下一篇

猜你喜欢

热点阅读