CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

虚函数定义成private有意义么?

楼主howyougen(夫孝,德之本也,教之所由生也)2006-03-02 16:44:39 在 C/C++ / C++ 语言 提问

比如    
   
  private:  
        virtual   void   speak();  
   
   
  虚函数是为了让派生类改写  
  但是如果虚函数定义成private,是不是没有意义? 问题点数:10、回复次数:8Top

1 楼xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨)回复于 2006-03-02 16:47:07 得分 1

有啊  
   
  你就不可以通过基类指针去访问派生类的这个函数了!Top

2 楼howyougen(夫孝,德之本也,教之所由生也)回复于 2006-03-02 16:50:31 得分 0

有啥意义?  
  Top

3 楼howyougen(夫孝,德之本也,教之所由生也)回复于 2006-03-02 16:55:34 得分 0

虚函数本来就是多态使用的,  
  如果不能用基类指针或引用访问,那还有什么意义?Top

4 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-02 17:01:15 得分 1

有啊,比如:  
   
  class   InnerFace  
  {  
  private:  
  virtual   void   fun1()   =   0;  
  friend   class   UseInner;  
  }  
   
  class   UseFace  
  {  
  public:  
  ...  
   
  }  
   
  UseFace   需要使用一个多态函数来实现它对外提供的功能,但不希望外面直接使用这个多态函数。。Top

5 楼Mephisto_76((望美人如梦))回复于 2006-03-02 17:54:21 得分 8

定义private   virtual   function是有意义的,代码如下:  
  class   B  
  {  
  public:  
      virtual   `B();  
  private:  
      virtual   char*   id()  
      {  
          return   "Base";  
      }  
   
  public:  
      void   Print(){   printf(   "Hello,I   am   %s",   id()   );   }  
  }  
   
  class   D   :   public   B  
  {  
  private:  
      virtual   char*   id()  
      {  
          //由于是private,这里不能用B::id();  
          return   "Derived";  
      }  
  }  
   
  B*   base   =   new   B();  
  base->Print();  
   
  B*   derived   =   new   D();  
  derived->Print();  
   
  上述两个输出的内容是不同的,在C++中virtual表示多态,public、protected和private表示访问权限,它们是正交的两个概念。用private声明虚函数,表示派生类对这个虚函数必需要有自己的实现,而不能调用基类的实现。  
  Top

6 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-02 18:02:33 得分 0

consider   a   Template   MethodTop

7 楼ox_thedarkness()回复于 2006-03-02 18:03:28 得分 0

哦~~   赞阿,楼上的有道理~~Top

8 楼howyougen(夫孝,德之本也,教之所由生也)回复于 2006-03-02 19:17:27 得分 0

//打算改写成下面这样,却发现与virtual的含义背离了   :)  
  #include   <stdio.h>  
  class   B  
  {  
  public:  
  virtual   ~B(){}  
  private:  
  const     char*   id()     //去掉virtual    
  {  
  return   "Base";  
  }  
   
  public:  
  virtual   void   Print(){   printf(   "Hello,I   am   %s\n",   id()   );   }  
  };  
   
  class   D   :   public   B  
  {  
  public:  
  virtual   ~D(){}  
                    //增加了这个  
  virtual   void   Print(){   printf(   "Hello,I   am   %s\n",   id()   );   }  
  private:  
  const   char*   id()   //去掉virtual    
  {  
  //由于是private,这里不能用B::id();  
  return   "Derived";  
  }  
  };  
   
  int   main()  
  {  
  B*   base   =   new   B();  
  base->Print();  
   
  B*   derived   =   new   D();  
  derived->Print();  
  return   0;  
  }  
   
  Top

相关问题

  • 自定义函数
  • 自定义函数
  • 自定义函数
  • 自定义函数
  • 将构造函数定义为private与其子类的构造函数有什么关系
  • “回调函数”的定义?
  • 函数定义问题
  • 怎么自定义函数???????
  • 库函数的定义
  • css定义event函数

关键词

  • virtual
  • 函数
  • 虚函数
  • 定义
  • 意义
  • 派生
  • derived
  • 类
  • i am%s
  • print

得分解答快速导航

  • 帖主:howyougen
  • xiaocai0001
  • adintr
  • Mephisto_76

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo