记录,待总结7

1.派生类指针必须强制转换为基类指针后才可以指向基类

基类指针转换为派生类指针容易导致崩溃性错误

虚基类的引用或派生不能转换为派生类

 

2.father *pf = new son;

//先构造父,再构造子,但pf指向的是父的对象。因此pf只能调用father的成员,不能调用son的成员

delete pf;

//只析构父,不析构子,造成内存泄漏

解决方法:

1)pf强制转换为son类,这种方法不好,容易出错

2)将father的析构函数定义为virtual,以实现多态

 

3.虚函数实现动态联编,开销大

 

4.联编:将一个调用函数者联结上正确的被调用者

静态联编:在编译时联编,在执行时不联编

动态联编:在编译时不联编,在执行时联编

 

5.只有在使用指针或引用时,才能实现动态联编,错误的动态联编如下:

class A { int x; public: A(){x = 1;cout<<"A"<<endl;} void get(){cout<<x<<endl;} }; class B: public A { int x; public: B(){x = 2;cout<<"B"<<endl;} void get(){cout<<x<<endl;} }; class C : public A { int x; public: C(){x = 3;cout<<"C"<<endl;} void get(){cout<<x<<endl;} }; int main() { A p; int choice; while(cin>>choice) { switch(choice) { case 1:p = A();break; case 2:p = B();break; case 3:p = C();break; } p.get(); } return 0; }

输出:A

输入:1

输出:A 1

输入:2

输出:A B 1

输入:3

输出:A C 1

不管输入什么,p.get();时都输出1,可见没有实现多态

 

6.直接调用非虚函数不会出现多态。

虚函数调用非虚函数,全部都能实现多态

 

7.继承不是多态

例:

class father { public: virtual void run(){cout<<"父跑"<<endl;} void jump(){cout<<"父跳"<<endl;} }; class son:public father { public: void run(){cout<<"子跑"<<endl;} void jump(){cout<<"子跳"<<endl;} }; int main() { father *pf = new son; pf->run(); pf->jump(); delete p; return 0; }


8.注意多态的正确用法

例:

class father { public: virtual void Test(){cout<<"父"<<endl;} }; class son:public father { public: void Test(){cout<<"子"<<endl;} }; class daughter:public father { public: void Test(){cout<<"女"<<endl;} }; void one(father one){one.Test();} void two(father *two){two->Test();} void three(father &three){three.Test();} int main() { int n; father *ps = new son;one(*ps);delete ps; //1 father *pd = new daughter;two(pd);delete pd; //2 father *pf = new father();three(*pf);delete pf; //3 return 0; }

输出:




解释:

1.由于不是以指针或引用的方式调用,即使是virtual函数,也无法实现多态

2.以指针的方式调用虚函数,因此是多态

3.以引用的方式调用虚函数,因此是多态

 

9.在虚函数中使用成员限定名,可以强制解除动态联编

例:

class father { public: virtual void Test(){cout<<"父"<<endl;} }; class son:public father { public: void Test(){cout<<"子"<<endl;} }; int main() { father *pf = new son; pf->Test(); pf->father::Test(); return 0; }

输出:

 

10.基类的析构函数若声明为虚,其派生类的析构函数也为虚

不存在虚构造函数

转载于:https://www.cnblogs.com/windmissing/archive/2012/01/17/2559872.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值