【问题标题】:when using "new" to allocate memory to a Derived class, how to call the Base constructor? [duplicate]使用“new”为派生类分配内存时,如何调用Base构造函数? [复制]
【发布时间】:2014-07-13 20:27:57
【问题描述】:

我正在使用new 为派生类分配内存, 我还想初始化它的基本私有成员

我该怎么做?

class Base {
private:
  int value;
}

class Derived : public Base {
  ....
}

使用基本构造函数的任何聪明方法? 谢谢!

【问题讨论】:

  • 在派生类构造函数的初始化列表中调用适当的构造函数。
  • 或者有专门的init()函数
  • 你不能,因为Base没有构造函数没有构造函数允许你设置value。此外,new 与此处完全无关。
  • 使用new 和调用基本构造函数是独立的问题。或者正如我们所说,它们是正交问题。顺便说一句,即使删除了点,您的类示例在语法上也是无效的。
  • @juanchopanza 那他为什么要问“使用 Base 构造函数”?我假设他可以编写一个构造函数(或至少一个初始化方法),否则这个问题没有多大意义,因为valA 中是私有的,因此对于B 的方法是“不可见的”。

标签: c++ inheritance


【解决方案1】:

Base需要有一个初始化value的构造函数,比如

Base(int v):value(v){};

然后,在Derived 构造函数中,您调用Base 构造函数为

Derived(int v):Base(v){...};

【讨论】:

  • 这对我很有效!谢谢!!
【解决方案2】:

基类的构造函数总是在大多数派生类的构造函数被调用之前被调用,无论你是否显式地调用它。默认情况下,调用默认构造函数。如果你想要一些其他的行为,你可以在初始化列表中进行:

class Base { 
protected:
    explicit Base(int) {}
};
class Derived : public Base {
public:
    Derived() : Base(42)  // <-- call to base constructor
    { }
};

【讨论】:

  • @KerrekSB 如果您确定,请下次自行编辑。 :)
【解决方案3】:

你可以让Drived类成为Base类的朋友

class Base
{
friend class Drived;
private:
    int a;
};

class Drived :public Base
{
public:
    Drived(){
        this->a=23;
    }
};

或者使基类的变量受保护:

class Base
{
protected:
    int a;
};

class Drived :public Base
{
public:
    Drived(){
        this->a=23;
    }
};

【讨论】:

  • 虽然它有效,但这是一个糟糕的编程习惯:如果你派生了 Drived 怎么办?您必须将新类标记为 Base 和 Drived 的朋友。想象一下这对一个大项目会做什么......
  • 另外:如果这是在一个库中,这意味着您的用户每次向继承树添加新类时都必须使用 Base 或其任何派生类重新编译所有内容...
猜你喜欢
  • 2019-08-07
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2016-07-19
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
相关资源
最近更新 更多