多继承下的虚拟函数
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();调用也可以。
不知各位大虾的意见如何?