一,请输出类名和m_x值。不需要处理CRoot类,只需处理A,B类。CRoot还有一些派送类,也不考虑。
class CRoot
{
public:
int m_x;
};
class A : public CRoot
{
public:
A()
{
m_x = 1;
}
};
class B : public CRoot
{
public:
B()
{
m_x = 2;
}
};
参考答案:
#include <iostream>
using namespace std ;
class CRoot
{
public:
virtual void Show()=0;
int m_x;
};
class A : public CRoot
{
public:
A()
{
m_x = 1;
}
virtual void Show()
{
cout << "类A:" << m_x << endl;
}
};
class B : public CRoot
{
public:
B()
{
m_x = 2;
}
virtual void Show()
{
cout << "类B:" << m_x << endl;
}
};
void main()
{
CRoot* p1 = new A;
CRoot* p2 = new B;
p1->Show();
p2->Show();
}
二,假定:一,CRoot的派送类不会增加。二,CRoot、A、B属于某公司,另外一个公司在他的基础上进行二次开发。二次开发的公司无法修改
这些类,而他们需要经常增加功能,所以希望有一个通用接口。
此情况下:可以使用访问者模式。
#include <iostream>
using namespace std ;
class A;
class B;
class IVistor
{
public:
virtual void VistorA(A& a)=0;
virtual void VistorB(B& a)=0;
};
class CRoot
{
public:
virtual void Accept(IVistor& v)=0;
int m_x;
};
class A : public CRoot
{
public:
A()
{
m_x = 1;
}
virtual void Accept(IVistor& v)
{
v.VistorA(*this);
}
};
class B : public CRoot
{
public:
B()
{
m_x = 2;
}
virtual void Accept(IVistor& v)
{
v.VistorB(*this);
}
};
class CNewVistor : public IVistor
{
public:
void VistorA(A& a)
{
cout << "类A:" << a.m_x << endl;
}
void VistorB(B& b)
{
cout << "类B:" << b.m_x << endl;
}
};
void main()
{
CNewVistor v;
CRoot* p1 = new A();
CRoot* p2 = new B();
p1->Accept(v);
p2->Accept(v);
}
三,不修改CRoot、A、B(现实中很可能没权限修改)。增加新功能:输出A,B等类的类名和m_x的平方。
增加新类
class CNewVistor2 : public IVistor
{
public:
void VistorA(A& a)
{
cout << "类A:" << a.m_x*a.m_x << endl;
}
void VistorB(B& b)
{
cout << "类B:" << b.m_x*b.m_x << endl;
}
};
v的类型改变。
CNewVistor2 v;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~