方大侠 发表于 2019-6-16 21:13:02

虚方法(virtual method)的意义??

虚方法 就是基类的函数前面加个 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,结果完全正确

感觉这个虚函数非常鸡肋,明明指针赋值的时候小心一点就可以了,有大神出来说说我这样改会有什么问题吗

newu 发表于 2019-6-16 21:24:47

1, 虚函数的作用主要用来支持后边要学习的多态。
2, 想想看,你的宠物不止是猫和老鼠还有其他一堆,如果都要去分别调用play()岂不是很累,这时候就需要另外一个函数了,具体慢慢学,到多态就明白了哈哈

我就是个弟弟 发表于 2019-6-17 09:20:11

研究一下C++的图形库,就会深有感触

2164930278 发表于 2019-6-18 08:13:14

正在看中,感觉有点难

AmosAlbert 发表于 2019-7-19 12:31:14

AmosAlbert 发表于 2019-7-19 12:30
塔克一点都不鸡肋哦虚函数一般存在于基类中。纯虚函数更是构成了虚基类,虚基类的作用就是用来被派生的, ...

还有重载也算多态的一种吧

h14268 发表于 2019-7-19 13:52:13

对于这个问题来说,这样改是没有问题的,c/c++是按模块(函数)编译的,也就是说,编译后的汇编形式与是否使用虚函数几乎没有差别,一个具体的函数会有一个具体的指针,如果在c语言里,可以用函数指针数组模拟多态,但是c++是面向对象设计的,而多态是面向对象的一大特征,c++编译器可以正确的选择实现函数来编译,方便了程序的编写过程。
如题,若要依次PET类的数组中不同子类的play方法,就可以一个循环搞定,而不需要再用子类分别调用方法。
至于编译器是如何具体实现条用不同函数实现的,就不太清楚了,盲猜还是用指针数组的方式。

Mondayisgood 发表于 2019-7-20 16:05:22

虚函数,是多层继承,才会用到的东西
比如 class a 有一个属性 高度,class b 继承 a,class c 继承a,class d 同时继承 b,c,不用虚函数,d就有两个高度
调用时就不知道用啥了,会报错
大概就是这样的意思

AmosAlbert 发表于 2019-8-1 15:38:20



虚函数的本质是通过基类访问派生类定义的函数。

虚函数只能借助于指针或者引用来达到多态效果
页: [1]
查看完整版本: 虚方法(virtual method)的意义??