C ++多态性问题,从子类实例化;不要将抽象类声明为指针

时间:2014-02-27 16:22:45

标签: c++ polymorphism

假设我们有一个Abstract类和一个子类(派生自抽象)类。我知道我们可以像这样derivedClass实例化:

AbstractBase *foo = new DerivedClass1();

但是,这是定义顶线代码的正确方法:

AbstractBase foo = *(new DerivedClass1());

我不想通过指针声明Abstract类。但是,做到这一点并管理记忆泄漏的最佳方法是什么? 非常感谢

2 个答案:

答案 0 :(得分:3)

AbstractBase foo = *(new DerivedClass1());将尝试使用构造函数构造AbstractBase的实例(您不能做,这是抽象的),该构造函数接受类型DerivedClass1的对象(或者它可以转换的东西)到。

如果您不希望最终得到指向AbstractBase的指针,但您确实希望使用new动态分配对象,那么您可能需要:

AbstractBase& foo = *(new DerivedClass1());

从新AbstractBase

定义对DerivedClass1的引用

答案 1 :(得分:1)

这是一个如何“链接”复制构造函数的非常简单的示例。请注意,语法可能有点偏,但这是一般的想法:

class ABase {
 public:
  ABase(const ABase& ab) {
    basevar = ab.getBasevar();
  }
  int getBasevar() { return basevar; }
 private:
  int basevar;
};

class c1 : public ABase {
 public:
  c1(const c1& c) : ABase(c) {
    cvar = c.getCvar();
  }
 private:
  int cvar;
};

特别注意在函数声明和定义之间使用:运算符;这个空间允许在构造函数中进行多个直接赋值(也可能在其他函数中),其内容称为“initialization list”。另请注意this answer,其中详细介绍了一些示例。