返回信息流例如有如下的类定义:
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,那么请问有没有什么好的方法可以既能实现多态又能访问派生类呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #96442同步于 2017/9/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
请教c++虚函数的正确使用方式
wjy1230
2017/9/21镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
既然是animal向量 如果用到了wagTail/bark就是设计有问题
【 在 wjy1230 (wjy1230) 的大作中提到: 】
: 例如有如下的类定义:
: class animal{
: public:
: ...................
那要怎么存储呢?是要dog和cat分别存储在容器中吗?如果是这样的话就不涉及多态机制了。
【 在 specops (Perfec) 的大作中提到: 】
: 既然是animal向量 如果用到了wagTail/bark就是设计有问题
通过『我邮2.0』发布
虚函数抽象的是各种子类都有的操作,基类子类之间表现为IsA关系
多态让基类类型的指针/引用可以操作子类类型,并调用子类重写的函数
所以对于基类类型的指针/引用不应该假设它到底在操作哪种子类类型
【 在 wjy1230 (wjy1230) 的大作中提到: 】
: 那要怎么存储呢?是要dog和cat分别存储在容器中吗?如果是这样的话就不涉及多态机制了。
嗯嗯,今天看了看,很有帮助
【 在 zxzy (zxzy) 的大作中提到: 】
: 记得Effective C++有提到过这个问题 题主可以去看看
通过『我邮2.0』发布