关于晚绑定,100分答谢
晚绑定的意思就是说执行期才确定所调用的函数的准确地址?
引发多态最关键的一点就是使用基类指针去寻找派生类的地址,
去调用派生类的函数?
想请问的是,这样的东西算不算多态
class A
{
public:
int run(){aa()};
virtual void aa(){};
};
class A_1 : public A
{
public:
void aa(){};
};
func()
{
A *p;
A_1 a1;
p = &a1;
p->aa();
// A_1 a1;
// a1.run();
}
我知道在这个时候调用的应该是A_1::aa();
那这样做的目的是什么?这样和注释掉的部分有什么区别?
未注释部分的哪里有晚绑定的痕迹?难道就是p=&a1就使得地址无法确认而
非得到运行期才知道?a1既然已经被实例了,为什么就找不到A_1::aa()呢?
而注释掉的部分是不是多态的用法?感觉上不象,因为run()已经被继承下来了,
所以用A_1对象的时候肯定调的A_1::aa(),对吗?
还有就是,比较正常的做法是不是象这样
func(A* p)
{
p->aa();
}
然后外面有个地方
A_1 a1;func(&a1);
这样做是不是多态?这样做我觉得和前面的没注释的部分一样
只是一个直接定义了类型的转换,一个是编译器控制的类型转化,对吗?
以上请教各位,呵呵,好象多了点
不过请麻烦不要让我去看什么书啦,看什么文档之类的,
我能找到的东西我基本都看了,只是还是觉得以上地方怪怪的,
对晚绑定的存在感到很奇怪,有什么东西在编译期找不到地方呢?
还是说我对晚绑定的定义,也就是对执行期绑定的定义没吃准?
那各位谁能给个明白点的答案,小的多谢了,毕竟郁闷了好多天了