鱼C论坛

 找回密码
 立即注册
查看: 2526|回复: 6

C++ 虚函数问题

[复制链接]
发表于 2012-7-28 22:02:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 kindly 于 2012-7-29 21:21 编辑

有个问题请教大家,
                        为什么把基类函数声明为虚函数,要是用继承类派生对象就不用把基类声明为虚函数,那为什么大多数还把基类
                    函数声明为虚函数,求指教
                       举个例子,
                      Class Company
                      {
                        public:
                                visual void display();    //虚函数
                      };
                      Class Tecncompany :public Company
                     {
                       public:
                                virtual void display();

                     };

                     int main()
                     {
                       Company techcompany1;         // techcompany1.disyplay() 运行派生类的函数,没有问题
                       Techcompany techcompany1;  //  要是这样,基类不用声明虚函数也行,也能运行派生类的函数
                       
                     
                      }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 00:37:51 | 显示全部楼层
。。我不知道你定义个父类对象能运行派生类对象函数是如何实现
只有两种情况才可以
父类是个引用类型对象 等于派生类对象 实际还是指向派生类对象
父类是个指针 指向派生类对象
这样才可以动态调用 实现虚函数性质

父类不定义虚函数 那叫隐藏
定义了叫覆盖 相当于重新改写虚表

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-29 19:38:54 | 显示全部楼层
#include <iostream>
#include <string>



class Company
{


public:
         virtual void display();//虚函数


};
void Company::display()
{

        std::cout<<"父类display()函数"<<std::endl;

}

class Techcompany: public Company
{
public:
         void display();

};
void Techcompany::display()
{
        std::cout<<"继承类的display()函数"<<std::endl;


}


int main()
{

        Company *p=new Techcompany;
        Techcompany *p2 =new Techcompany;   // 用这种方法父类就不用声明为虚函数了
        p->display();
        p2->display();


        delete p,p2;
        p=NULL;
        p2=NULL;



  system("PAUSE");
  return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-29 19:42:24 | 显示全部楼层
   我第一个代码没写清楚,不好意思,刚发的代码没问题,我以调试过
我的问题就是  Techcompany *p2 =new Techcompany;   // 用这种方法父类就不用声明为虚函数了
那为什么还使用   Company *p=new Techcompany;  这种方法,还需把父类,定义为虚函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-29 19:43:59 | 显示全部楼层

多谢了 ,我又发了代码 ,您有时间帮忙看一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 21:01:28 | 显示全部楼层
面向对象方法
虚函数可以动态调用函数 是对方法的抽象 是一个接口
比如要对一种图形做DRAW方法 可以在基类抽象为虚函数
任一种图形继承下来 都有DRAW方法 如果我们写个函数 调用下一种图形的DRAW方法
你要写N个图形的参数的函数 但是你要用虚函数 只用写一个基类的指针参数即可

好处是方便管理 可扩展 要写项目才能理解出好处

另一个必须使用虚函数的是析构函数  如果基类指针指向的派生类对象有new出空间 当delete基类指针时
不会调用派生类里的析构 如果定义基类的析构函数为虚函数 则会调用派生类析构 析构派生类时会自动往上析构其父类
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-29 21:20:04 | 显示全部楼层
ccqiji 发表于 2012-7-29 21:01
面向对象方法
虚函数可以动态调用函数 是对方法的抽象 是一个接口
比如要对一种图形做DRAW方法 可以在基类 ...

好,明白了 ,多谢了 !!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 17:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表