继承机制的两个特性:多态+动态绑定
2007-01-19 10:37
316 查看
多态:
基类的指针或者引用可以指向任何派生类对象的能力;(一般类型而言不允许,因为C++强类型语言,其他只有静态类型一说,对于指针和引用具有静态类型和动态类型两个方面)
动态绑定:
1。(和虚拟函数永不分家,配合才能实现)
派生类存在一个函数,而基类无,则此时未建立虚拟函数机制,即使指针,或引用的动态类型是派生类类型,也并不能调用,一句话,没有虚拟函数存在,动态类型也就不存在,一切都以静态类型(象普通的类型检查一样)为准
2。根据指针或者引用所指向的实际对象类型(指针,引用的动态类型),来调用合适的虚拟成员函数
(当并非虚拟函数的时候,即使指针的动态类型是派生类,由于并无虚拟机制的支持,此时也不能实现动态绑定,而只能根据当时指针引用的静态类型,调用静态类型的成员函数)
虚拟函数机制未建立,一切以静态类型执行
class B
{
public:
B(){}
void ok(){cout << "B::ok()" << endl;}
};
class D1:public B
{
public:
D1(){}
void ok(){cout << "D1::ok()" << endl;}
};
int main()
{
B b;
B *p = &b;
p -> ok();
D1 d1;
p = &d1;
p -> ok();
return 0;
}
成员函数分为:
1。建立虚拟机制的(动态类型存在,进行动态绑定,如ok()函数)
2。未建立虚拟机制的(动态类型此时未建立,一切以静态类型执行,如d1_ok()函数)
class B
{
public:
B(){}
virtual void ok(){cout << "B::ok()" << endl;}
};
class D1:public B
{
public:
D1(){}
void ok(){cout << "D1::ok()" << endl;}
void d1_ok(){cout << "D1::d1_ok()" << endl;}
};
int main()
{
B b;
B *p = &b;
p -> ok();
D1 d1;
p = &d1;
p -> ok();
p -> d1_ok();
return 0;
}
派生类继承基类的所有成员,私有成员也继承过来了,所以尺寸只大不小,只是并不能直接访问,即使通过派生类的成员函数,同样也不能访问
(可以这么理解:
派生类的成员函数只能访问
1。自己加进来的成员,无所谓什么权限;
2。从基类继承来的非私有成员,而从基类继承来的私有成员,只能通过基类成员函数访问)
class B
{
public:
B(){a = 3;}
virtual void ok(){cout << "B::ok()" << endl;}
int get(){return a;}
virtual void vget(){}
private:
int a;
};
class D1:public B
{
public:
D1(){}
void ok(){cout << "D1::ok()" << endl;}
void d1_ok(){cout << "D1::d1_ok()" << endl;}
virtual void vget(){cout << B::get() << endl;}
};
int main()
{
B b;
B *p = &b;
p -> ok();
D1 d1;
p = &d1;
p -> ok();
cout << p -> get() << endl;
// p -> d1_ok();
p -> vget();
return 0;
}
基类的指针或者引用可以指向任何派生类对象的能力;(一般类型而言不允许,因为C++强类型语言,其他只有静态类型一说,对于指针和引用具有静态类型和动态类型两个方面)
动态绑定:
1。(和虚拟函数永不分家,配合才能实现)
派生类存在一个函数,而基类无,则此时未建立虚拟函数机制,即使指针,或引用的动态类型是派生类类型,也并不能调用,一句话,没有虚拟函数存在,动态类型也就不存在,一切都以静态类型(象普通的类型检查一样)为准
2。根据指针或者引用所指向的实际对象类型(指针,引用的动态类型),来调用合适的虚拟成员函数
(当并非虚拟函数的时候,即使指针的动态类型是派生类,由于并无虚拟机制的支持,此时也不能实现动态绑定,而只能根据当时指针引用的静态类型,调用静态类型的成员函数)
虚拟函数机制未建立,一切以静态类型执行
class B
{
public:
B(){}
void ok(){cout << "B::ok()" << endl;}
};
class D1:public B
{
public:
D1(){}
void ok(){cout << "D1::ok()" << endl;}
};
int main()
{
B b;
B *p = &b;
p -> ok();
D1 d1;
p = &d1;
p -> ok();
return 0;
}
成员函数分为:
1。建立虚拟机制的(动态类型存在,进行动态绑定,如ok()函数)
2。未建立虚拟机制的(动态类型此时未建立,一切以静态类型执行,如d1_ok()函数)
class B
{
public:
B(){}
virtual void ok(){cout << "B::ok()" << endl;}
};
class D1:public B
{
public:
D1(){}
void ok(){cout << "D1::ok()" << endl;}
void d1_ok(){cout << "D1::d1_ok()" << endl;}
};
int main()
{
B b;
B *p = &b;
p -> ok();
D1 d1;
p = &d1;
p -> ok();
p -> d1_ok();
return 0;
}
派生类继承基类的所有成员,私有成员也继承过来了,所以尺寸只大不小,只是并不能直接访问,即使通过派生类的成员函数,同样也不能访问
(可以这么理解:
派生类的成员函数只能访问
1。自己加进来的成员,无所谓什么权限;
2。从基类继承来的非私有成员,而从基类继承来的私有成员,只能通过基类成员函数访问)
class B
{
public:
B(){a = 3;}
virtual void ok(){cout << "B::ok()" << endl;}
int get(){return a;}
virtual void vget(){}
private:
int a;
};
class D1:public B
{
public:
D1(){}
void ok(){cout << "D1::ok()" << endl;}
void d1_ok(){cout << "D1::d1_ok()" << endl;}
virtual void vget(){cout << B::get() << endl;}
};
int main()
{
B b;
B *p = &b;
p -> ok();
D1 d1;
p = &d1;
p -> ok();
cout << p -> get() << endl;
// p -> d1_ok();
p -> vget();
return 0;
}
相关文章推荐
- JAVA中几个易混淆关键词的理解:行为,隐藏,组合和继承,覆写和重载,多形(多态)性,动态绑定,上溯造型,抽象类,接口
- Objective-c 特性之多态、动态类型和动态绑定
- Java 多态:动态绑定 及 内部实现机制
- 深入理解OOP(三):多态和继承(动态绑定和运行时多态)
- 动态绑定和多态——面向对象最核心的机制
- B 类 对象 继承 多态与动态绑定
- object-c 继承、多态动态绑定 第八天
- 继承与多态,动态绑定,final,abstract
- Java继承机制的初始化顺序+静态动态绑定
- 抽象、封装、继承、扩展、覆盖、多态、动态绑定
- JAVA中几个易混淆关键词的理解:行为,隐藏,组合和继承,覆写和重载,多形(多态)性,动态绑定,上溯造型,抽象类,接口
- java多态总结以及动态绑定机制
- 一个抽象类Shape 里边有两个抽象方法 计算面积 和 周长; Shape由三角形和圆形继承,利用多态的特性设计完成不同子类的功能
- Java的继承(继承、多态、动态绑定、静态绑定、泛型数组、对象包装器的自动装箱与自动拆箱)
- 面向对象的三的特性:封装 继承 多态
- JAVA三大特性—封装、继承、多态
- obj-c编程05:类的多态与id动态绑定
- c# 动态生成继承类并实现序列化特性
- C#三大特性之 封装、继承、多态
- 深入浅出OOP(一): 多态和继承(早期绑定/编译时多态)