C++ 通过派生类创建基类成员[关闭]

问题描述 投票:0回答:1

我在理解以下代码时遇到困难:

class Base{
   Base(){/* do stuff */};
};

class Deriv: public Base{
   Deriv(){/* do stuff */};
};

// I have a problem understanding the purpose of the next line
Base &foo = *(new Deriv());
c++ derived-class base-class
1个回答
1
投票

首先,你需要熟悉多态、引用、解引用和临时对象行为。

  1. 某个类的每个对象都可以表示为(可以被视为)层次结构中更高的类的对象。

最流行的例子是动物。许多资料都用它来描述这个话题。

class Animal {};

class Dog : public Animal {};

int main() {
    // All dogs are animals: OK
    Animal* a = new Dog();

    // Not every animal is a dog: Error
    Dog* d = new Animal()
}

假设您正在创建一个游戏,您的玩家有一只宠物。

class WongPlayer {
    Dog* pet;
}

这样说的话,宠物就只能是狗了

class CorrectPlayer {
    Animal* pet;
}

在这种情况下,您可以将任何继承自 Animal 的类作为宠物。

这只是多态性用法的一个简单示例。

  1. 参考资料。 解释什么是引用的最好方法是将它们视为别名。 创建引用与创建别名完全相同。 而所有的限制也都通过这种方式很好的理解了

例子:

int a = 5;
int& b = a; // b is alias of a
b = 3; // a = 3
  1. 取消引用。 new 返回一个指针,因此要使用它指向的对象,您必须首先取消引用它。

例子:

int* val = new int(1);
val = 5; // Error can't assign int to pointer
*val = 5; OK
 delete val;
  1. 临时对象,它们被立即创建和删除。

例子:

class A {
    public:
        A() { std::cout << "Created" << std::endl;}
        ~A() { std::cout << "Destroyed" << std::endl;}
}

int main {
    A();
    std::cout << "Should it be printed before destruction? No!" << std::endl;
    return 0;
}

在您的情况下,您执行以下操作: 在堆中分配一个对象并返回它的指针。

new Deriv()

取消引用该指针

*(new Deriv())

创建引用并将其与新创建的对象绑定。

这里我们开始遇到一些问题。它不是临时对象!堆中的对象永远不会被破坏。 这是明显的内存泄漏

我不知道你为什么要创建一个参考。 最好的方法是创建一个指针。

Base* ptr = new Deriv();

然后

delete ptr;

就是这样。

但是是的,你也可以这样删除它

Base& ref = *(new Deriv());
delete &ref;
© www.soinside.com 2019 - 2024. All rights reserved.