多继承下的虚拟函数

xmlhb 2004-07-03 01:39:16
详细见潘爱民C++ Primer中文版p797
抽象的ZooAnimal 类含有所有动物公共的信息并且为所有的一般查询提供公有接口。
class Bear : public ZooAnimal {
public:
virtual ~Bear();
virtual ostream&print( ostream&) const;
virtual string isA() const;
// ...
}
class Endangered {
public:
virtual ~Endangered();
virtual ostream&print( ostream&) const;
virtual void highlight() const;
// ...
}
现在我们来定义Panda 它提供了自己的print()实例析构函数并引入了一个新的
虚拟函数cuddle()如下
class Panda : public Bear, public Endangered
{
public:
virtual ~Panda();
virtual ostream&print( ostream&) const;
virtual void cuddle();
// ...
}

当用Panda 类对象的地址初始化或赋值Bear 或ZooAnimal 指针或引用时Panda 接口中Panda 特有的部分以及Endangered 部分就都不能再被访问例如
Bear *pb = new Panda;
pb->print( cout ); // ok: Panda::print(ostream&)
pb->isA(); // ok: Bear::isA()
pb->cuddle(); // 错误: 不是 Bear 接口的部分
pb->highlight(); // 错误: 不是 Bear 接口的部分
delete pb; // ok: Panda::~Panda()

类似地当用Panda 类对象的地址初始化或赋值Endangered 指针或引用时Panda 接口
中Panda 特有的部分以及Bear 部分都不能再被访问例如
Endangered *pe = new Panda;
pe->print( cout ); // ok: Panda::print(ostream&)
pe->isA();// 错误: 不是 Endangered 的接口部分
pe->cuddle();// 错误: 不是 Endangered 的接口部分
pe->highlight(); // ok: Endangered::highlight()
delete pe; // ok: Panda::~Panda()

我认为上面两段有问题,effective c++上也有说明。
我认为pb的动态型别为Panda*,pb->cuddle();和pb->highlight();调用可以;
同样,pe的动态型别为pe->isA();和pe->cuddle();调用也可以。

不知各位大虾的意见如何?
...全文
92 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmlhb 2004-07-04
  • 打赏
  • 举报
回复
谢谢nickshen() ,是我没仔细看,动态调用的虚函数必须在前面存在。
nickshen 2004-07-03
  • 打赏
  • 举报
回复
你可以看看inside c++ model,类的对象布局,可以由bear寻找到panda是因为vptr的存在,现在bear的vptr里没有上面讲的后来定义的虚函数的存在,你让他如何动态绑定呢?
xmlhb 2004-07-03
  • 打赏
  • 举报
回复
up

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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