多态运用中,如何扩展某个子类中增加的方法(其他子类无此方法),而不修改父类???

ronallee 2012-07-11 06:53:25
//A类是父类,
class A
{
public:
A();
virtual ~A();

virtual void Func1() = 0;
};

//B类继承A类,
class B : public A
{
public :
B();
~B();

void Func1()
{
printf("B类 你好!");
}
};


//C类继承A类。
class C : public A
{
public :
C();
~C();

void Func1()
{
printf("C类 你好!");
}
};


main()
{
A *a1 = new B();
A *a2 = new C();

a1->Func1(); // 打印 : B类 你好!
a2->Func1(); // 打印 : C类 你好!
}

上例中,假如C类中又增加了一个方法X,但是B类中没有方法X。这样的话,如果仍使用多态方式,访问父类的指针得到具体运行时的方法,就必须把方法X添加到父类A中。

如果再增加D、E、F等类(这些类都继承自A类),并且每个子类都有各自独有的方法,如果使用多态父类指针的方式调用这些方法,必须把这些方法添加到父类A中。每增加一个子类就得向父类中增加子类新增的方法,这样非常麻烦,不易维护

请教,有没有解决这种问题的 方案哈?非常感谢。
...全文
346 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 3 楼 的回复:
visit模式,当然了visit模式自己也是有严重问题的。


visit模式是不是每一个新增的方法 都得 新增一个类?
[/Quote]

是的。

看看哥的拙作:
C++实现Behavioral - Visitor模式

一点不改动或者增加那是不可能去适应变化的。的确,Visitor模式是解决楼主此类的问题的一个解决之道。
如果你的代码规模不算很大,建议用2楼的方法。如果代码规模比较大,还是用Visitor模式吧。
pathuang68 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 2 楼 的回复:
C/C++ code

#include <iostream>
using namespace std;

class A
{
public:
virtual ~A()
{
}
virtual void Func1() = 0;
};

//B类继承A类,
class B : public A
{
public :
~B(……

……
[/Quote]
是的。
ronallee 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
visit模式,当然了visit模式自己也是有严重问题的。
[/Quote]

visit模式是不是每一个新增的方法 都得 新增一个类?
ronallee 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
C/C++ code

#include <iostream>
using namespace std;

class A
{
public:
virtual ~A()
{
}
virtual void Func1() = 0;
};

//B类继承A类,
class B : public A
{
public :
~B(……
[/Quote]

这种方法是可以,但是我想说的是这种情况,整个程序中有N个子系统(例如B、C),每个子系统都继承自一个父类(例如A)。某种情况下,当系统运行时是无法知道pb和pc到底是指向哪个子类,这时就不能强制转换了。
pathuang68 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 1 楼 的回复:
我怎么没有看懂楼主的意思呢?这和多态什么的有什么关系么?


我想说的是,如何解决:系统中有N个子类,其中一个子类增加新方法,父类不用跟着增加这个方法,在这种情况下程序还能用父类的指针访问当这个新方法。
[/Quote]

如果是这样的话,应该无解。
ronallee 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
我怎么没有看懂楼主的意思呢?这和多态什么的有什么关系么?
[/Quote]

我想说的是,如何解决:系统中有N个子类,其中一个子类增加新方法,父类不用跟着增加这个方法,在这种情况下程序还能用父类的指针访问当这个新方法。
taodm 2012-07-11
  • 打赏
  • 举报
回复
visit模式,当然了visit模式自己也是有严重问题的。
pathuang68 2012-07-11
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

class A
{
public:
virtual ~A()
{
}
virtual void Func1() = 0;
};

//B类继承A类,
class B : public A
{
public :
~B()
{
}
void Func1()
{
printf("B类 你好!\n");
}
};


//C类继承A类。
class C : public A
{
public:
~C()
{
}
void Func1()
{
printf("C类 你好!\n");
}

void xFunc1()
{
printf("C类 你好!!!!\n");
}
};

int main(int argc, char** argv)
{
A* pb = new B;
A* pc = new C;

pb->Func1();
pc->Func1();

// 可以通过这种向下转型的方式,调用C中特有的成员函数
(dynamic_cast<C*>(pc))->xFunc1();

return 0;
}
W170532934 2012-07-11
  • 打赏
  • 举报
回复
我怎么没有看懂楼主的意思呢?这和多态什么的有什么关系么?
标题基于Spring Boot的骑行路线规划与分享平台研究AI更换标题第1章引言介绍骑行路线规划与分享平台的研究背景、意义、国内外现状以及本论文的方法和创新点。1.1研究背景与意义分析骑行运动普及和路线分享需求,阐述平台设计的必要性。1.2国内外研究现状概述国内外在骑行路线规划与分享方面的技术发展和应用现状。1.3研究方法与创新点说明本文采用的研究方法和实现的创新功能。第2章相关理论与技术介绍Spring Boot框架、路线规划算法和分享技术的基础理论。2.1Spring Boot框架概述解释Spring Boot的核心概念和优势,以及在本平台的应用。2.2路线规划算法原理阐述常用的路线规划算法,如Dijkstra、A等,并分析其适用场景。2.3分享技术实现方式介绍平台实现路线分享所采用的技术手段,如社交媒体集成、二维码生成等。第3章平台需求分析与设计详细阐述骑行路线规划与分享平台的需求分析、系统设计和数据库设计。3.1需求分析从用户角度出发,分析平台应具备的功能和性能要求。3.2系统设计设计平台的整体架构、模块划分以及各模块之间的交互方式。3.3数据库设计根据平台需求,设计合理的数据库表结构和数据存取方式。第4章平台实现与测试说明平台的开发环境、关键模块的实现过程,以及系统测试的方法与结果。4.1开发环境搭建介绍开发平台所需的软硬件环境及其配置方法。4.2关键模块实现详细描述路线规划、路线分享等核心功能的实现细节。4.3系统测试与性能评估对平台进行功能测试、性能测试,并分析结果以验证系统的稳定性和可靠性。第5章结论与展望总结本文的研究成果,指出不足之处,并展望未来的研究方向和改进措施。5.1研究结论概括性地阐述本文的主要研究内容和取得的成果。5.2未来工作展望针对当前研究的局限性,提出未来可能的改进方向和扩展功能。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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