首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

最近学到多态,有几点概念不是很明白,请高手解答一下,多谢

2012-04-10 
最近学到多态,有几点概念不是很明白,请高手解答一下,谢谢!class A{public:virtual void print(){cout h

最近学到多态,有几点概念不是很明白,请高手解答一下,谢谢!
class A
{
public: 
virtual void print(){
cout <<"hello! A Class!"<<endl;
  }
};

class B:public A
{
public:
void print(){
cout <<"hello! B Calss"<<endl;
  }
};

void display(A *P){
P->print();
}

int main()
{
A a;
B b;
a.print();
b.print();

display(&a);
display(&b);
system ("pause");
}
如上面代码 ,最近学到多态,有几点概念不是很明白,请高手解答一下,谢谢!

1:对象指针只能指向类中的成员,还是可以越类随便指? 基类跟派生类的对象指针可以"越类"指向吗?

2:如题我上面display()函数的形参是 A类对象指针,为什么却可以使用B类对象指针? 而且使用了以后指向的还是B类的print()函数...这里不解..

3:基类可以访问派生类的成员吗?除了设置友元以外,基类能不能通过 "继承" 的关系或者其他方法来调用他派生类的成员?

4:虚函数的概念有点模糊...设置了虚函数表示什么意思?


就这些问题不太懂,概念有点模糊,烦请高手悉心指教一下,谢谢!

[解决办法]
1. 类指针是不能随便乱指的. 只能指向该类或其派生类的对象.
2. 派生类的指针 可以自动转型为它的 基类的指针. 所以类的指针也可以指向从它派生的类对象. 反之不成立, 基类指针不能自动转型为派生类的指针, 需呀使用 reinterpret_cast 进行转换. 如果对象不是那个类的对象的话转换将会失败.
  
虚函数的调用不是直接在编译的时候确定函数地址的.是通过对象的一个隐藏成员--虚函数表来进行调用的, 所以它是绑定到对象上的.

3. 基类不能访问派生类的成员, 但是可以通过虚函数的返回值等方式来间接访问.
[解决办法]
1.什么叫“越类”?不明白你说的“越类”是什么意思。 基类成员与派生类没有任何关系,所以基类的对象指针不能指向派生类新建的成员。但派生类由于是继承了基类的,即继承了基类的成员,成员函数,所以派生类的对象指针可以访问基类的非private成员,成员函数,同名函数可以用 "::" 访问。
2.class B是class A的派生类,当b 作为参数传到display(A *) 时b已经隐式转换为class A了,所以
display(b) 的结果是"hello! A Class!"。
当该,a 不能隐式转换为class B!
3.我没想过把派生类设为基类的友元。。。暂时没这方面的需要。
4.看书吧。。。

我学这儿的时候,是用两本书一起看,看看这本,看看那本,因为每本书解释的方法都不一样,看多本书,可能会比较容易理解,因人而异~~

热点排行