最近学到多态,有几点概念不是很明白,请高手解答一下,谢谢!
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.看书吧。。。
我学这儿的时候,是用两本书一起看,看看这本,看看那本,因为每本书解释的方法都不一样,看多本书,可能会比较容易理解,因人而异~~