读书人

private承继与复合

发布时间: 2012-11-22 00:16:41 作者: rapoo

private继承与复合

private继承与复合

文章出自:blog.csdn.net/windows_nt

private继承定义:private继承而来的所有成员,在derived中都会变成private属性。
应用场合:当一个意欲成为derived class 者想访问一个意欲成为base class 者的protected成分,
或为了重新定义一或多个virtual 函数时可以用private继承。
知识点:
private继承意味只有实现部分被继承,接口部分应略去。
如果classes之间的继承关系是private,编译器不会自动将一个derived class对象转换为一个base class对象,
这样的转换会导致错误。请记住,private继承纯粹只是一种实现技术。

尽量用复合代替private继承。因为复合可避免virtual函数重定义。
事例:
class Widget : public Timer
{
private:
virtual void onTick() const; //查看Widget的数据等等。
};

//复合实现
class Widget
{
private:
class WidgetTimer : : public Timer
{
public:
virtual void onTick() const; //查看Widget的数据等等。
};
WidgetTimer timer;
};

2楼zhangxxxww昨天 16:55
谢谢!
1楼zhangxxxww昨天 11:04
您好!为什么x的值不是1呢n[code=cpp]n#include<iostream>nusing namespace std;nclass A{npublic: nt int x;nt A(int a,int b){ntt a=x;ntt b=u;}nt void prt(){nt cout<<cout<<x<<endl;}nprivate:ntint u;n};nclass B:public A{npublic:ntB(int a,int b,int c):nt A(a,b){ntt y=c;}nt int y;nt void prt(){ntt cout<<"A::x=:"<<A::x<<endl;ntt A::prt();ntt cout<<" B::y=:"<<B::y<<endl;nt }n };nint main(){ntB b(1,2,3);ntb.prt();ntcout<<b.x<<endl;n}nnttnnnn[/code]
Re: windows_nt昨天 15:14
回复zhangxxxwwn#include<iostream> nusing namespace std; nclass An{ npublic: ntint x; ntA (int a, int b)nt{ nttx = a; nttu = b;nt} ntvoid prt()nt{ nttcout<<x<<endl;nt} nprivate: ntint u; n}; nclass B : public An{ npublic: ntB(int a, int b, int c) : A (a, b)nt{ ntty = c;nt} ntint y; ntvoid prt()nt{ nttcout<<"A::x=:"<<A::x<<endl; nttA::prt(); nttcout<<" B::y=:"<<B::y<<endl; nt} n}; nint main()n{ ntB b(1,2,3); ntb.prt(); ntcout<<b.x<<endl; ntgetchar();n} nA构造函数中的赋值写反了吧?n应该是下边的赋值给x和u吧?nttx = a; nttu = b;

读书人网 >编程

热点推荐