我想知道c ++和java都使用oops概念,但语法却完全不同。
我发现java使用新的ClassName()来获取对堆的引用,但获取对堆的相同引用,为什么c ++使用新的ClassName。
#include<iostream>
using namespace std;
class Bike
{
public:
virtual void run()
{
cout << "running";
}
};
class Splender :public Bike
{
public:
void run()
{
cout << "running safely with 60km";
}
};
int main()
{
Bike &obj = new Splender();//error but reason?
obj.run();
}
错误: 无法初始化类型&#39; Bike&amp;&#39;来自类型&#39; Splender *&#39;
的左值答案 0 :(得分:0)
#include <iostream>
class Bike {
public:
virtual void run() {
std::cout << "running";
}
virtual ~Bike() {}
};
class Splender: public Bike {
public:
void run() override {
std::cout << "running safely with 60km";
}
};
int main() {
Bike *obj = new Splender(); // new returns a pointer to a dynamically allocated object
obj->run();
delete obj;
}
显示:
running safely with 60km
答案 1 :(得分:0)
有时我们认为做正确的事情。 你有点困惑。尝试:
Bike *obj=new Splender();
答案 2 :(得分:0)
两件事。一:Operator new将指针而不是引用返回给对象实例。所以请使用Bike* obj = new Splender();
二:不要变得可爱并尝试Bike& obj = *new Splender();
因为新内容可以在低内存情况下返回nullptr
,如果你取消引用它,你的程序将在那时崩溃。 (并且您被迫使用丑陋的delete *obj;
来清理此对象,因为用户4581301在评论中指出。)
哦,using namespace std
是一种不好的做法。在您使用标准库的地方添加std::
,它不会让您失望。