静态类型
是指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型。静态类型仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变。通俗的讲,就是上下文无关,在编译时就可以确定其类型。
动态类型
是指由一个左值表达式表示的左值所引用的最终派生对象的类型。例:如果一个静态类型为“类 B ”的指针p 指向一个继承于 B的类 D 的对象,则表达式 *p 的动态类型为“D”。引用按照相似规则处理。一般地讲,基类的指针和基类引用有可能为动态类型,就是说在运行之前不能够确定其真实类型。通常我们说,“基类指针指向的对象的实际/真正类型”或“基类引用所引用的对象的实际/真正类型”,就是它们的动态类型。很显然,这个动态类型是 C++ 语言通过指针和引用实现运行时多态能力的核心概念。
动态绑定与静态绑定class Base { public: void func() { cout << "func() in Base." << endl; } virtual void test() { cout << "test() in Base." << endl; } }; class Derived : public Base { void func() { cout << "func() in Derived." << endl; } virtual void test() { cout << "test() in Derived." << endl; } }; int main() { Base* b; b = new Derived(); b->func(); b->test(); }
class Base { public: void Print() { cout << "Print() from Base." << endl; } virtual void Display() { cout << "Display() from Base." << endl; } }; class Derived1 : public Base { public: void Print() { cout << "Print() from Derived1." << endl; } void Display() { cout << "Display() from Derived2." << endl; } }; class Derived2 : public Base { public: void Print() { cout << "Print() from Derived2." << endl; } void Display() { cout << "Display() from Derived2." << endl; } }; class Derived3 : public Base { public: void Print() { cout << "Print() from Derived3." << endl; } void Display() { cout << "Display() from Derived3." << endl; } };
//通过基类引用作形参实现多态 void Polymorphic1(Base& b) { b.Print(); b.Display(); } //通过基类指针作形参实现多态 void Polymorphic2(Base* b) { b->Print(); b->Display(); }
下面是测试代码:
int main() { Base b; Derived1 d1; Derived2 d2; Derived3 d3; vector<Base> base_vec; base_vec.push_back(b); base_vec.push_back(d1); base_vec.push_back(d2); base_vec.push_back(d3); vector<Base*> base_ptr_vec; base_ptr_vec.push_back(&b); base_ptr_vec.push_back(&d1); base_ptr_vec.push_back(&d2); base_ptr_vec.push_back(&d3); cout << endl << "对通过基类引用作形参实现多态进行测试" << endl; //对通过基类引用作形参实现多态进行测试 (测试方式错误) for (int i = 0; i != base_vec.size(); ++i) { Polymorphic1(base_vec[i]); } cout << endl << "对通过基类指针作形参实现多态进行测试" << endl; //对通过基类指针作形参实现多态进行测试 for (int i = 0; i != base_vec.size(); ++i) { Polymorphic2(base_ptr_vec[i]); } cout << endl << "对通过基类引用作形参实现多态进行测试" << endl; //对通过基类引用作形参实现多态进行测试 Polymorphic1(b); Polymorphic1(d1); Polymorphic1(d2); Polymorphic1(d3); return 0; }
测试结果如下图: