|
20鱼币
虚方法 就是基类的函数前面加个 virtual,类似于 virtual void play();这样的
是为了c++在编译的时候遇到同类型的指针,不直接使用基类的函数(c++为了保证速度,同类型的指针一起处理),
而是等到程序运行的时候根据子类的指针
-
- class Pet{
- public:
- Pet(std::string theName);
- void play(); //virtual
- protected:
- std::string name;
- };
- Pet::Pet(std::string theName){
- name = theName;
- }
- void Pet::play(){
- std::cout << name <<"正在玩\n";
- }
- class Cat :public Pet{
- public:
- Cat(std::string theName);
- void play();
- };
- Cat::Cat(std::string theName) :Pet(theName){
- }
- void Cat::play(){
- std::cout << name <<"正在爬树\n";
- }
- class Mouse :public Pet{
- public:
- Mouse(std::string theName);
- void play();
- };
- Mouse::Mouse(std::string theName) :Pet(theName){
- }
- void Mouse::play(){
- std::cout << name <<"正在偷奶酪\n";
- }
- int main(){
- Pet *cat = new Cat("Tom");
- Pet *mouse = new Mouse("Jerry");
- cat->play();
- mouse->play();
- }
复制代码
上面代码运行时,cat和mouse在编译过程中都是pet类型的指针会一起执行pet::play()这个函数,
通过在Pet类里加virtual就可以分别使用cat和mouse 里的play了,virtual void play();
但是我这样改
Cat *cat = new Cat("Tom");
Mouse *mouse = new Mouse("Jerry");
不用加virtual,结果完全正确
感觉这个虚函数非常鸡肋,明明指针赋值的时候小心一点就可以了,有大神出来说说我这样改会有什么问题吗 |
|