打印

C++多态和继承的问题

[复制链接]
1080|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
txcy|  楼主 | 2012-5-26 23:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <iostream>
using namespace std;

class A
{
public:
//virtual void f()
//{
// cout << "this is A " <<endl;
//}
};

class B:public A
{
public:
void f()
{
cout<<"this is B "<<endl;
}
};

int main()
{
A *b = new B;
b->f();
delete b;

return 0;
}

为什么b不可以调用f()呢 ?

相关帖子

沙发
无冕之王| | 2012-5-26 23:29 | 只看该作者
b->f()
跟 A b;b.f();是一样的
原本就没有A类型就没有f(),你怎么调用?

使用特权

评论回复
板凳
yybj| | 2012-5-26 23:36 | 只看该作者
为什么要注释掉呢?

使用特权

评论回复
地板
pkat| | 2012-5-26 23:39 | 只看该作者
因为A中没有f这个函数。

楼主知道A *b = new B;这句话的含义吗?我来说说我的理解,供参考:
1. B是继承A的
2. 那么B对象中有一块内存用于存放A那一部分内容的,包括A中的私有成员变量都会存放在这块内存中,只是B对象通过正常的方式没有办法调用而已(用特殊的方法,可以很容易从B对象获取A中的私有成员)
3. A *b = new B;这句话就是将B对象中存放A的那一部分内容,提取出来给b,B比A多出来的部分就被剪裁掉了
4. 而3中经过剪裁后的b,并没有成员函数f,因此b->f()必然失败

使用特权

评论回复
5
火箭球迷| | 2012-5-26 23:44 | 只看该作者
使用指针和引用的时候如果没有虚函数,就是采用静态绑定或联翩,这时候A类没有这个函数。看一下为什么积累的指针可以指向子类估计也会明白

使用特权

评论回复
6
李冬发| | 2012-5-27 21:54 | 只看该作者
类中的成员函数,要在父类中能够被操作,必须父类中指定为virtual属性的,要不不会被替换的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

274

主题

2106

帖子

0

粉丝