【发布时间】:2015-10-26 15:26:44
【问题描述】:
基础抽象类:
class Satellite
{
public:
Satellite();
virtual void center()=0;
virtual ~Satellite(){}
};
第一个派生类
class Comm_sat:public Satellite
{
public:
Comm_sat();
void center() override{cout << "comm satellite override\n";}
};
第二个派生类
class Space_station:public Satellite
{
public:
Space_station();
void center() override{cout << "space station override\n";}
};
函数的指针版本
void f(Satellite* ms){
ms->center();
delete ms;
}
int main()
{
Comm_sat* cs = new Comm_sat;
Space_station* ss = new Space_station;
f(cs);
f(ss);
}
在main() 中使用new 创建的对象在f() 中被正确销毁,对吧?
函数的参考版本
void f(Satellite& ms){
ms.center();
}
int main()
{
Comm_sat cs;
Space_station ss;
f(cs);
f(ss);
}
参考版更好吗?
此外,我尝试使用unique_ptr,但是,我得到了错误
void f(Satellite* ms){
ms->center();
}
int main()
{
unique_ptr<Comm_sat> cs{new Comm_sat};
unique_ptr<Space_station> ss{new Space_station};
f(cs);
f(ss);
}
错误:无法将
std::unique_ptr<Comm_sat>转换为Satellite*以将参数1转换为void f(Satellite*)
错误:输入class std::unique_ptr<Comm_sat>参数给delete,预期指针delete cs;
另一个派生类也出现同样的错误。
【问题讨论】:
-
void main是不允许的。
标签: c++ pointers reference polymorphism