我有一个具有多个继承级别的类层次结构。
cloneable声明一个纯虚成员函数返回cloneable *.base派生自cloneable,但不声明任何成员函数。- 最后,从虚函数
derived派生base并定义,但将返回类型覆盖为derived *.
通过base指向derived对象的指针调用虚函数返回cloneable *。我期待base *,因为虚函数的实现返回derived *可转换为base *. 这里发生了什么?
如果我在 中声明纯虚函数base,我终于可以base *从中得到,但我不明白为什么这个声明是必要的。
代码:
struct cloneable
{
virtual cloneable * clone() = 0;
};
struct base : cloneable
{
// virtual base * clone() = 0; // this line resolves the compile error
};
struct derived : base
{
virtual derived * clone () { return new derived; }
};
int main(int, char**)
{
derived d;
base * bp = &d;
base * bbp = bp->clone(); // error: invalid conversion
// from ‘cloneable*’ to ‘base*’
return 0;
}
注意:我故意省略了虚拟析构函数以缩短代码示例。