smgp 发表于 2017-6-18 15:33:43

c++ 虚方法指针为什么要指向基类

#include <iostream>

class Pet
{
public:
        virtual void play();
};

class Cat : public Pet
{
public:
        void play();
};

class Dog : public Pet
{
public:
        void play();
};

void Pet::play()
{
        std::cout << "宠物在玩!!" << std::endl;
}

void Cat::play()
{
        Pet::play();
        std::cout << "猫猫在玩!!" << std::endl;
}

void Dog::play()
{
        Pet::play() ;
        std::cout << "狗狗在玩!!" << std::endl;
}

int main()
{
        Pet *cat = new Cat;
        Pet *dog = new Dog;
       
        cat->play();
        dog->play();
       
        return 0;
}

定义指向基类Pet的指针,调用被覆盖的play()函数。这里使用了虚方法。那为什么不最开始就定义指向子类的指针,一定要先定义成虚函数,后面又定义指向基类的指针?这样不是也可以么?

#include <iostream>

class Pet
{
public:
        void play();
};

class Cat : public Pet
{
public:
        void play();
};

class Dog : public Pet
{
public:
        void play();
};

void Pet::play()
{
        std::cout << "宝宝在玩!!" << std::endl;
}

void Cat::play()
{
        Pet::play();
        std::cout << "猫猫在玩!!" << std::endl;
}

void Dog::play()
{
        Pet::play() ;
        std::cout << "狗狗在玩!!" << std::endl;
}

int main()
{
        Cat *cat = new Cat;
        Dog *dog = new Dog;
       
        cat->play();
        dog->play();
       
        return 0;
}

newu 发表于 2017-6-18 16:59:21

那为什么不最开始就定义指向子类的指针,一定要先定义成虚函数,后面又定义指向基类的指针?这样不是也可以么?

当然是可以的啊,不过这里先定义成虚函数,后面又定义基类指针,是为了显示出,子类对象传给基类指针,能够自动识别出是某个基类的方法被调用。

这就是多态!
页: [1]
查看完整版本: c++ 虚方法指针为什么要指向基类