为什么我们不能像在java中一样使用新的ClassName(),而不是使用新的ClassName?

时间:2018-03-20 17:03:28

标签: c++ inheritance polymorphism upcasting

我想知道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;

的左值

3 个答案:

答案 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::,它不会让您失望。