【发布时间】:2015-02-02 08:37:49
【问题描述】:
在 c++11 标准中,如果 B 类继承自 A 类,则“B 是 A”。 但是,我仍然对这个概念感到困惑: 看看这段代码:
class Base {
public:
virtual ~Base() {}
virtual Base* clone() const = 0;
};
class Derived : public Base {
public:
virtual Base* clone() const {
return new Derived(*this);
}
//<more functions>
};
我们从 Derived 返回了一个指向 Base 的指针,但是如果在这段代码中使用这种方法:
Derived* d1 = new Derived();
Derived* d2 = d1->clone();
我们所做的是在Derived* 中分配Base*!!
问题:
为什么这段代码不能编译?如何修改它(为什么?)以适应继承?
【问题讨论】:
-
您发布的代码无法编译。请发布工作代码。特别是如果您的问题是“这段代码是如何编译的?”。
-
即使我写
Derived d1;而不是Derived d1 = new Derived();它也不会编译。在 VS 2013 中,我在声明d2的行中收到预期的错误消息“无法从 'Base *' 转换为 'Derived *'”。 -
我猜你的意思是在派生类中返回
Derived*类型,这叫做covariance -
感谢您的关注。我修改了这个问题,希望它会更清楚,因为我希望它根据我所询问的继承标准和条件进行编译。
标签: c++ c++11 inheritance clone