一、名词解释
1,多态
1)静态多态:a) 函数多态:函数重载,运算符重载
b) 模板多态:函数模板,类模板
2)动态多态:虚函数(切记:只有通过指针或引用才能实现动态多态性。"对象.虚函数“ 和 ”类::虚函数“ 这两种形式不能实现多态)
2,静态类型与动态类型
1) 静态类型:声明对象时,对象被赋予的类型,编译时期确定。
2) 动态类型:指针或引用所指对象的类型。常常是,基类指针指向派生类对象,那么这个指针(或引用)的静态类型是基类指针或引用,其动态类型就是派生类指针或引用。
3,静态绑定与动态绑定
1) 静态绑定:亦或静态联编。在编译程序时就根据调用函数提供的信息,把它所对应的具体函数确定下来(编译时期,把调用函数名与具体函数绑定在一起。)
2) 动态绑定:亦或动态联编。在编译程序时还不能确定函数调用所对应的具体函数,只有在程序运行过程中才能够确定函数调用所对应的具体函数。
巧计:动态绑定只发生在继承类的虚函数上(且这个虚函数无缺省参数),其它一概是静态绑定。
二、实例解析
我们看下面这一个示例。
1 #include <iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 virtual void func(int val = 1) { 7 cout<< "A->" << val << endl; 8 } 9 virtual void test() { 10 func(); 11 } 12 13 virtual void func2() { 14 cout << "Base A" << endl; 15 } 16 }; 17 class B : public A 18 { 19 public: 20 void func(int val = 0) { 21 cout<<"B->"<<val <<endl; 22 } 23 void func2() { 24 cout << "Base B" << endl; 25 } 26 }; 27 int main(int argc ,char* argv[]) 28 { 29 cout << "Virtual function with default parameters." << endl; 30 B*p = new B; //p的静态类型和动态类型都是 B* 31 p->test(); 32 p->func2(); 33 34 cout << endl << "reference work with virtual function." << endl; 35 B objectB; 36 A &objectA = objectB; //objectA的静态类型是 A&, 动态类型是 B& 37 objectA.func(); 38 objectA.func2(); 39 40 cout << endl << "object work with virtual functions." << endl; 41 A objectA2; 42 objectA2.func(); 43 objectA2.func2(); 44 return 0; 45 }
1,静态类型,动态类型已在程序中注释
2,程序输出
1)第一输出
这一输出是测试带有缺省参数的虚函数。我们看到,基类虚函数的缺省参数没有被修改。(这一情况,总说纷纭,有的把他归于动态绑定,有的归于静态绑定)。所以,尽量不要定义继承而来的缺省参数。
2)第二输出
用基类引用调用派生类虚函数,实现多态。
3)第三输出
基类对象调用自家成员函数,忽略virtual关键字。
时间: 2024-10-12 14:39:57