双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

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

我不得踢噶 我不得踢噶 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近在看刘伟老师写的设计模式,看到了合成复用原则这里
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;
}

得到想输出的结果:


这是为什么?本人愚钝求指教。
...全文

相关推荐

评论 15
收藏 已收藏
分享
返回顶部
我不得踢噶
C++ 语言 65,214 成员 250,514 内容