您的位置:首页 > 其它

11-多态与继承(上)

2016-03-24 21:24 288 查看

一.函数重写

*: 在子类中定义与父类中原型同样的函数

*: 函数重写仅仅发生在父类与子类之间

class Parent
{
public:
void print()
{
cout<<"parent"<<endl;
}
};
class Child:public Parent
{
public:
void print()
{
cout<<"child"<<endl;
}
};


说明: print() 就为重写函数

*: 父类中被重写的函数依旧会继承给子类

*: 默认情况下子类重写的函数将隐藏父类中的函数

*:通过作用域分辨符::能够訪问到父类中被隐藏的函数

child.print();
child.Parent::print();


当函数重写遇上赋值兼容性原则

void run()
{
Child child;

Parent* pp = &child;
Parent& rp =child;

child.print();
pp->print();
rp.print();
}




问题所在:

(1) C++与C同样,是静态编译型语言

(2) 在编译时,编译器自己主动依据指针的类型推断指向的是一个什么样的对象

(3) 所以编译器觉得父类指针指向的是父类对象

(4) 因为程序没有执行。所以不可能知道父类指针指向的详细是父类对象还是子类对象

(5) 从程序安全的角度。编译器如果父类指针仅仅指向父类对象。因此编译的结果为调用父类的成员函数。

void func(Parent* p)
{
p->print();
}


分析: 在编译这个函数的时候,编译器不可能知道指针P指向什么,可是没有理由报错,于是编译器觉得

最安全的做法是编译到父类的print函数。

二. 多态的本质


依据实际的对象类型决定函数调用语句的详细调用目标


*: 假设父类指针指向的是父类对象,则调用父类中定义的函数

*: 假设父类指针指向的是子类对象,则调用子类中定义的重写函数

多态: 相同的调用语句有多种不同的表现形态





C++中的多态支持

*: C++中通过 virtual keyword对多态进行支持

*: 使用virtual声明的函数被重写后就可以表现出多态性

父类函数中增加virtual

class Parent
{
public:

virtual void print()
{
cout<<"parent"<<endl;
}
};




小结:

(1) 函数重写仅仅可能发生在父类与子类之间


(2) virtual keyword是C++中支持多态的唯一方式

(3) 被重写的虚函数就可以表现出多态性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: