免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4701 | 回复: 7
打印 上一主题 下一主题

[C++] C++ 虚函数 const成员函数 多态 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-18 22:13 |只看该作者 |倒序浏览
5可用积分
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;

  4. class Base {
  5. public:
  6.      virtual ~Base(){}
  7.      virtual void display() const {
  8.          cout << "Base" << endl;
  9.      }
  10. };

  11. class Derive:public Base {
  12. public:
  13.         virtual ~Derive(){}
  14.         virtual void display() {
  15.                 cout << "Derive" << endl;
  16.         }

  17. };

  18. int main()
  19. {
  20.         Base *pbase = new Derive();
  21.         pbase -> display();
  22.         return 0;
  23. }
复制代码
输出
Base
为啥?

最佳答案

查看完整内容

由于不是重载,这里跟函数签名没有关系。原因是,C++的多态要求函数除了协变外,其余情况下都必须是相同的。Derive中的display函数hide了Base中的display,而不是override,在pbase -> display();中,final overrider就是Base的display,所以结果是“Base”

论坛徽章:
0
2 [报告]
发表于 2013-01-18 22:13 |只看该作者
由于不是重载,这里跟函数签名没有关系。

原因是,C++的多态要求函数除了协变外,其余情况下都必须是相同的。

Derive中的display函数hide了Base中的display,而不是override,在pbase -> display();中,final overrider就是Base的display,所以结果是“Base”

论坛徽章:
0
3 [报告]
发表于 2013-01-18 22:45 |只看该作者
const 也是函数签名的一部分

论坛徽章:
0
4 [报告]
发表于 2013-01-18 22:54 |只看该作者
回复 2# sonicling

兄弟,你的回答真干练。

意思就是 两个display就是两个不同的函数,压根不存在多态性


   

论坛徽章:
0
5 [报告]
发表于 2013-01-18 22:54 |只看该作者

两个display就是两个不同的函数,压根不存在多态性。

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
6 [报告]
发表于 2013-01-18 22:58 |只看该作者
本帖最后由 方兆国 于 2013-01-18 22:58 编辑

是不是静态函数的缘故

论坛徽章:
0
7 [报告]
发表于 2013-01-19 02:12 |只看该作者
可以理解为 Derive 中同时存在着类似如下两个函数:
  1. virtual void Derive::display(Derive const *this); // 基类中带来的
  2. virtual void Derive::display(Derive *this); // 派生类中的
复制代码

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
8 [报告]
发表于 2013-01-19 11:17 |只看该作者

const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。

void function()const; //常成员函数, 常成员函数是不能改变成员变量值的函数。

const成员函数表示该成员函数只能读类数据成员,而不能修改类成员数据。定义const成员函数时,把const关键字放在函数的参数表和函数体之间。有人可能会问:为什么不将const放在函数声明前呢?因为这样做意味着函数的返回值是常量,意义完全不同。



(2)const修饰成员函数
const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。
    class A
    {
        …
       void function()const; //常成员函数, 它不改变对象的成员变量.                        

//也不能调用类中任何非const成员函数。
}

对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。

a. const成员函数不被允许修改它所在对象的任何一个数据成员。

b. const成员函数能够访问对象的const成员,而其他成员函数不可以。




http://blog.csdn.net/Eric_Jo/article/details/4138548
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP