C/C++一些知识4(重载与多态、虚继承)
2009-08-13 14:15
387 查看
重载与覆盖初学者比较容易搞混的两个知识点,它们都是在子类父类的同名方法之间的关系。其实这两者之间的区别并不难。
重载与覆盖
重载与覆盖的最大区别就是在于覆盖的函数必须保持参数列表完全相同,而重载的函数参数列表必须有所不同。也就是看参数。当然还有其他的区别:覆盖的函数在父类需要声明为虚函数,加上virtual标示符。从深层次来讲:重载的函数是编译器对于函数命名的一种使用,对于编译器中的函数名来讲,它会将函数的参数加到函数名上去,比如fun(int a)函数在编译器里的命名有可能变成了fun_int。所以重载函数依然是一种早绑定。而覆盖函数是为了实现多态,它的函数需要实现晚绑定。也就是在执行的时候才可以决定到底是用哪个函数来执行。使用了virtual这个关键字也就是说明需要晚绑定。在执行的时候函数会依照对象归属的类来调用函数。如果是子类的对象,则会调用子类的函数,如果是父类,则会调用父类的函数。下面是一个例子:#include <iostream> #include <CString> using namespace std; class base { public: void virtual foo(){cout << "base::foo" << endl;} void foo1(){cout << "base:foo1" << endl;} void foo2(){cout << "base:foo2" << endl;} }; class derive : public base { public: void foo(){cout << "derive::foo" << endl;} void foo1(){cout << "derive::foo1" << endl;} void foo2(int i){cout << "derive:foo2" << endl;} }; int main() { base b; base *pb = 0; derive d; b.foo(); b.foo1(); b.foo2(); d.foo(); d.foo1(); d.foo2(1); pb = &d; pb->foo(); pb->foo1(); pb->foo2(); return 0; }这个程序执行的结果为:
base::foo base:foo1 base:foo2 derive::foo derive::foo1 derive:foo2 derive::foo base:foo1 base:foo2前六行结果没有太多问题,在使用指针调用函数的地方我们可以发现在调用foo函数是,虽然是base的指针,但是函数却调用了derived的函数,说明实行了动态绑定(晚绑定),而其他的两个函数都调用了base的。
虚继承
虚继承也是一个带有virtual的东西,所有带有virtual的东西都是为了实现动态绑定的。虚继承也是这样子的。虚继承是class derive: public virtual base。或者class derive:virtual public base,virtual和public的位置可以互换。虚继承的出现是为了弥补多重继承的缺陷。例如有//没有虚继承 class A; class B: public A; class C: public A; class D: public B, public C; //虚继承 class A; class B: public virtual A; class C: public virtual A; class D: public B, public C;那么在D的眼中,B和C的父类是两个不同的类,也就是讲如果新建了一个D,那么会有两个A建出来,那么对于A中的方法,参数会出现重复定义的错误。为了解决这个问题,使用了虚继承,使用了虚继承后新建D的时候只有一个A会建出来,这样就不会出错了。
相关文章推荐
- C++有关类、继承、多态、构造、析构、重载
- c++训练营---继承,多态,重载
- c++ 重载、继承、多态
- 【c++知识归纳】继承与多态(一)
- 【c++知识归纳】继承与多态(二)
- C++继承、虚函数、纯虚函数、多态、覆盖、重载、隐藏、引用等常用概念
- C++ 类的相关知识 构造,析构,继承与多态
- c++(一) 类 对象 重载 继承 多态 构造函数 虚函数 覆盖 纯虚函数等
- 一段代码讲述C++继承、多态、友元、静态变量、重载
- 【Java】Java基础知识1. 继承、多态、重载和重写
- c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
- 面向对象__阶段总结__【覆盖与重载的区别】【继承,多态的一些细节】
- C++ 封装、继承、多态、重载、覆盖、隐藏基本概念详解
- C++继承的一些知识
- C++继承-重载-多态-虚函数
- C++面向对象开发:继承、多态、重载及访问修饰符
- c++面向对象三大特征封装、继承和多态知识总结
- C++简单学习(Part2_lecture 8)(继承、重载、多态、虚函数)
- JAV中一些基本概念:构造函数、方法重载、继承、方法重写、多态。
- C++ 类的多态(方法的重载与继承)