我有一个具有多个继承级别的类层次结构。
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;
}
注意:我故意省略了虚拟析构函数以缩短代码示例。