BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #96442同步于 2017/9/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

请教c++虚函数的正确使用方式

wjy1230
2017/9/21镜像同步9 回复
例如有如下的类定义: class animal{ public: animal(){} virtual void eat()=0; protected: int weight; }; class dog:public animal{ public: dog():animal(){} void eat() override; void bark(); }; class cat:public animal{ public: cat():animal(){} void eat() override; void wagTail(); }; std::vector<animal*> avec; 将animal定义为抽象基类,其中eat()为纯虚函数。dog和cat分别继承自animal,并在类内对eat()方法进行了重写然后new出cat或dog对象,将animal类型指针存入vector。遍历容器调用eat()方法即可实现多态。 然而cat和dog又定义了自己独有的方法(wagTail和bark),但animal类的指针不能访问派生类的方法。如果需要访问派生类的方法,我一般会用dynamic_cast把基类指针转换为派生类指针,但是据说工程上不太推荐使用dynamic_cast,那么请问有没有什么好的方法可以既能实现多态又能访问派生类呢?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
specops机器人#1 · 2017/9/21
既然是animal向量 如果用到了wagTail/bark就是设计有问题 【 在 wjy1230 (wjy1230) 的大作中提到: 】 : 例如有如下的类定义: : class animal{ : public: : ...................
glswy机器人#2 · 2017/9/21
方法名一定要不一样吗?可否再在 wagTail 外层包一层虚函数?
wjy1230机器人#3 · 2017/9/21
那要怎么存储呢?是要dog和cat分别存储在容器中吗?如果是这样的话就不涉及多态机制了。 【 在 specops (Perfec) 的大作中提到: 】 : 既然是animal向量 如果用到了wagTail/bark就是设计有问题 通过『我邮2.0』发布
specops机器人#4 · 2017/9/21
虚函数抽象的是各种子类都有的操作,基类子类之间表现为IsA关系 多态让基类类型的指针/引用可以操作子类类型,并调用子类重写的函数 所以对于基类类型的指针/引用不应该假设它到底在操作哪种子类类型 【 在 wjy1230 (wjy1230) 的大作中提到: 】 : 那要怎么存储呢?是要dog和cat分别存储在容器中吗?如果是这样的话就不涉及多态机制了。
zxzy机器人#5 · 2017/9/21
记得Effective C++有提到过这个问题 题主可以去看看
intmain机器人#6 · 2017/9/21
用基类指针调用方法,当然是调用基类拥有的接口,多态也只是接口的内部实现不同而已
shan10211865机器人#7 · 2017/9/21
去看看设计模式?估计能解决你的问题
wjy1230机器人#8 · 2017/9/22
嗯嗯,今天看了看,很有帮助 【 在 zxzy (zxzy) 的大作中提到: 】 : 记得Effective C++有提到过这个问题 题主可以去看看 通过『我邮2.0』发布
z470967263机器人#9 · 2017/10/8
感觉虚函数 纯虚函数 等等都和设计模式息息相关