关于继承中对象指针的一些问题。

我不得踢噶 2014-02-13 03:32:17
最近在看刘伟老师写的设计模式,看到了合成复用原则这里
http://blog.csdn.net/lovelion/article/details/7563441

我看到了他画的uml类图,我想自己写一写试试能不能实现这种不违反开闭原则添加子类来添加功能。
然后piapiapia的写完了,一运行出问题了
代码如下
#include<iostream>
using namespace std;

class DBUtill
{
public:
virtual void getConnection()
{
cout<<"basic getConnection()"<<endl;
}
};

class OracleDBUtill : public DBUtill
{
public:
virtual void getConnection()
{
cout<<"sub getConnection()"<<endl;
}
};

class CustomerDAO
{
private:
DBUtill utill;
public:
CustomerDAO(DBUtill utill)
{
this->utill = utill;
}
~CustomerDAO()
{
}
void addCustomer()
{
utill.getConnection();
}
};

int main()
{
DBUtill d1;
OracleDBUtill od1;
CustomerDAO* c1 = new CustomerDAO(d1);
CustomerDAO* c2 = new CustomerDAO(od1);
c1->addCustomer();
c2->addCustomer();
return 0;
}

本来预期输出的是
basic getConnection()
sub getConnectio()
但是事与愿违,输出的是:


然后我改成将DBUtill类的对象指针来初始化CustomerDAO类的对象,
代码如下:
#include<iostream>
using namespace std;

class DBUtill
{
public:
virtual void getConnection()
{
cout<<"basic getConnection()"<<endl;
}
};

class OracleDBUtill : public DBUtill
{
public:
virtual void getConnection()
{
cout<<"sub getConnection()"<<endl;
}
};

class CustomerDAO
{
private:
DBUtill* utill;
public:
CustomerDAO(DBUtill* utill)
{
this->utill = utill;
}
~CustomerDAO()
{
}
void addCustomer()
{
utill->getConnection();
}
};

int main()
{
DBUtill* d1= new DBUtill();
OracleDBUtill* od1 = new OracleDBUtill();
CustomerDAO* c1 = new CustomerDAO(d1);
CustomerDAO* c2 = new CustomerDAO(od1);
c1->addCustomer();
c2->addCustomer();
return 0;
}

得到想输出的结果:


这是为什么?本人愚钝求指教。
...全文
142 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻夢之葉 2014-02-21
  • 打赏
  • 举报
回复
引用 13 楼 jianwen0529 的回复:
2L早已经给出正解
是1L
幻夢之葉 2014-02-21
  • 打赏
  • 举报
回复
2L早已经给出正解
kmcfly 2014-02-21
  • 打赏
  • 举报
回复
我不得踢噶 2014-02-13
  • 打赏
  • 举报
回复
引用 2 楼 zhouwei1983426 的回复:
DBUtill 改成 DBUtill& 就可以了。 对象传递 是有 object sliceing的。 需要用 引用。
百度了下object slicing恍然大悟。学习了,谢谢!
buyong 2014-02-13
  • 打赏
  • 举报
回复
DBUtill utill; 赋值后派生类信息丢了
我不得踢噶 2014-02-13
  • 打赏
  • 举报
回复
引用 8 楼 zhouwei1983426 的回复:
private: DBUtill utill; 你这个也得改啊。。。。 多态 只能用 指针,引用。。。
嗯。改了能正确输出了。谢谢!
zhouwei1983426 2014-02-13
  • 打赏
  • 举报
回复
private: DBUtill utill; 你这个也得改啊。。。。 多态 只能用 指针,引用。。。
我不得踢噶 2014-02-13
  • 打赏
  • 举报
回复
引用 5 楼 derekrose 的回复:
构造的方法好奇特
哪里奇特了?
我不得踢噶 2014-02-13
  • 打赏
  • 举报
回复
引用 2 楼 zhouwei1983426 的回复:
DBUtill 改成 DBUtill& 就可以了。 对象传递 是有 object sliceing的。 需要用 引用。
你是说CustomerDAO构造函数中的参数改成对象引用吗? 我这样改了也不行。
derekrose 2014-02-13
  • 打赏
  • 举报
回复
构造的方法好奇特
zhouwei1983426 2014-02-13
  • 打赏
  • 举报
回复
如果你这么写的话, 对象已经被 阉割掉了。 你拿到的 只有DBUtill object. CustomerDAO(DBUtill utill) { this->utill = utill; }
ztenv 版主 2014-02-13
  • 打赏
  • 举报
回复
你没有发生多态的例子: CustomerDAO* c2 = new CustomerDAO(od1);这里相当于将od1的基类实例传给了构造函数
zhouwei1983426 2014-02-13
  • 打赏
  • 举报
回复
DBUtill 改成 DBUtill& 就可以了。 对象传递 是有 object sliceing的。 需要用 引用。
ztenv 版主 2014-02-13
  • 打赏
  • 举报
回复
多态的前提:引用或指针;

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧