Dict.CN 在线词典, 英语学习, 在线翻译

学海苦作舟,书山勤为径

留下点回忆

常用链接

统计

积分与排名

Denoise

English study

Web技术

数据压缩

一些连接

最新评论

为什么C++中只有指针和引用才能实现多态?

类似代码如下:
class A
{
public:
    virtual void Test(){}
};

class B:public A
{
public:
   virtual void Test(){}
};

B b;
A a = b;
A * pA = &b;

a.Test();
pA->Test();

大家都知道a.Test调用的是A::Test,而pA->Test调用的是B::Test,那么为什么呢?

首先来看a.Test;其实很容易理解,这里的a就是一个A类型的变量,它的内存布局在赋值的时候已经从B转换到A了,多于的数据都被丢弃,因此其就是一个A类型的变量。
而对于pA来说,其是一个指针,其类型虽然是A,但指向的区域的内容却是一个B类型的内存结构,虽然内存结果的布局与A兼容,但其虚函数表中的Test却是B的实现;因此如上面所说。同样引用也会达到如此的效果。
我想这就是所说的指针和引用不会引发内存中任何“与类型有关的内存委托操作”吧。

posted on 2011-04-06 21:27 笨笨 阅读(3916) 评论(8)  编辑 收藏 引用 所属分类: 代码优化

评论

# re: 为什么C++中只有指针和引用才能实现多态?[未登录] 2011-04-06 21:47 jejer

我认为是:
1 默认赋值操作不改变vtable 还是A的vtable
2 指针拷贝不改变vtable 还是B的vtable  回复  更多评论   

# re: 为什么C++中只有指针和引用才能实现多态? 2011-04-06 22:55 笨笨

@jejer
你可以这么说  回复  更多评论   

# re: 为什么C++中只有指针和引用才能实现多态? 2011-04-06 23:05 hook

能不能先看看书。。。Inside C++ Obj Model 写了多少年了都。就算不看现成的东西,研究一下编译器原理自己做个实现然后再跟现实中的比较才有提高,你这样自己瞎猜真的有点浪费生命……

btw,如果你说的多态是指“同一个函数调用根据上下文有不同语义”的话,并不只有指针和引用才能实现多态,template、bind+functor都可以。  回复  更多评论   

# re: 为什么C++中只有指针和引用才能实现多态? 2011-04-06 23:25 so

假设:
void fun(A a)
{
a.memfun1();
}

B b;
fun(b);
//如果memfun1是虚函数,且具有多态性质,那么可能进入A派生类的memfun1中,如果在此函数中访问派生类变量;那么该是怎样一回事呢?
//另外,b转化到一个局部变量~~传递到fun函数,是怎样的过程,如何转化?  回复  更多评论   

# re: 为什么C++中只有指针和引用才能实现多态? 2011-04-06 23:51 笨笨

@hook
不想说更多,你可能误解我的意思了,谢谢你的留言。。。  回复  更多评论   

# re: 为什么C++中只有指针和引用才能实现多态? 2011-04-06 23:55 笨笨

@so
//如果memfun1是虚函数,且具有多态性质,那么可能进入A派生类的memfun1中,如果在此函数中访问派生类变量;那么该是怎样一回事呢?
这调用的是A的memfun1;因此不会访问派生类(B)的变量,说实话,它没有。。。

//另外,b转化到一个局部变量~~传递到fun函数,是怎样的过程,如何转化?
这个参数传递的过程是通过调用A的拷贝构造函数来完成的;如果A没有编译器默认产生一个,因此到函数内部就只是A的类型了。如果你这里改成指针,就不会调用拷贝构造函数,最后调用的是B的memfun1.  回复  更多评论   

# re: 为什么C++中只有指针和引用才能实现多态? 2011-04-11 12:47 EvilGhost

没看懂标题和内容有什么关系。  回复  更多评论   

# re: 为什么C++中只有指针和引用才能实现多态?[未登录] 2011-08-29 11:14 无名

没看懂标题和内容有什么关系。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理