继承机制的两个特性:多态+动态绑定
来源:互联网 发布:linux服务器配置方案 编辑:程序博客网 时间:2024/05/17 04:06
多态:
基类的指针或者引用可以指向任何派生类对象的能力;(一般类型而言不允许,因为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继承机制的初始化顺序+静态动态绑定
- Java的动态绑定机制
- Java的动态绑定机制
- Java的动态绑定机制
- Java的动态绑定机制
- Java的动态绑定机制
- Java继承中覆写机制的两个口诀
- 继承和动态绑定
- JAVA动态绑定的内部实现机制
- Python的动态绑定与赋值机制
- JAVA动态绑定的内部实现机制
- Java动态绑定机制的内幕
- 【解惑】Java动态绑定机制的内幕
- JAVA动态绑定的内部实现机制
- JAVA动态绑定的内部实现机制
- 【解惑】Java动态绑定机制的内幕
- 如何是SELECTION屏幕输入框变成密码输入框
- strchr
- (4)'c++:COMPLETE REFERENCE' 第一部分 第一章(c语言概述) 第三节
- 不同茶的饮用方法
- 考研前夜···
- 继承机制的两个特性:多态+动态绑定
- 数据结构的一些方法
- 为什么会出现LINK2005"符号已定义"的链接错误?
- 关于DataGrid控件中的自动编号
- VC操作Word之(一)
- VC操作Word之(二)
- VC操作Word之(三)
- WPF/E初步印象(测试代码)
- VC操作Word之(四)