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

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中。每增加一个子类就得向父类中增加子类新增的方法,这样非常麻烦,不易维护

请教,有没有解决这种问题的 方案哈?非常感谢。
...全文
357 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
  • 打赏
  • 举报
回复
我怎么没有看懂楼主的意思呢?这和多态什么的有什么关系么?

5,530

社区成员

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

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