您的位置:首页 > 其它

继承机制的两个特性:多态+动态绑定

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: