覆盖或删除继承的构造函数

时间:2010-07-01 09:41:39

标签: c++ class inheritance

这是一些C ++代码:

#include <iostream>
using namespace std;

class m
{
    public:
    m() { cout << "mother" << endl; }
};

class n : m
{
    public:
    n() { cout << "daughter" << endl; }
};

int main()
{
    m M;
    n N;
}

这是输出:

mother  
mother  
daughter

我的问题是我不想在创建N时调用m的构造函数。我该怎么办?

5 个答案:

答案 0 :(得分:10)

AFAIK,你无法删除继承的构造函数。

您的示例中的问题来自不正确的类设计。 构造函数通常用于分配类资源,设置默认值等。 它不完全适合用于输出内容。

你应该把

n() { cout << "daughter" << endl; }

进入虚拟功能。

一般情况下 - 如果您需要删除继承的构造函数,那么您可能需要重新考虑/重新设计类层次结构。

答案 1 :(得分:1)

class m
{
public:
      m(bool init = true) { if (init) cout << "mother" << endl; }
};


class n : m
{
public:
      n() : m(false) { cout << "daughter" << endl; }
};

或者如果您不希望它是公开的

class m
{
protected:
    m(bool init) { if(init) Init(); }
    Init() { cout << "mother" << endl; }

public:
      m() { Init(); }
};

class n : m
{
public:
      n() : m(false) { cout << "daughter" << endl; }
};

答案 2 :(得分:1)

构造函数永远不会被继承。会发生什么是C ++生成一个默认的nullary构造函数,用于初始化基类和类类型的成员。基类总是被初始化,并且无法阻止它,因此如果您不希望调用基类构造函数,请不要从基类继承。

答案 3 :(得分:0)

两种解决方案:

  1. 请勿从n派生m。检查您是否确实具有接口重用(您依赖于多态接口)而不是实现重用。在后一种情况下,更喜欢将m*成为n的成员,然后在需要时仅创建m对象。这将是我的首选解决方案。

  2. 您可能不希望调用m的构造函数,因为它执行了您不想要的操作。将您不想执行的代码从m构造函数移动到专用的init()函数等中,然后根据需要调用它。我不建议这样做,因为你最终得到一个有状态的界面。

答案 4 :(得分:0)

任何类的对象都包含其所有超类的子对象。并且所有这些必须必须在构造主要对象之前构建。这个结构的一部分是调用基类构造函数之一,它不能省略。您只能选择要调用的构造函数。