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

gok*_*oon 6 c++ inheritance class

这是一些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;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

mother  
mother  
daughter
Run Code Online (Sandbox Code Playgroud)

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

Sig*_*erm 12

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

您的示例中的问题来自不正确的类设计.构造函数通常用于分配类资源,设置默认值等.它不适合用于输出某些东西.

你应该放

n() { cout << "daughter" << endl; }
Run Code Online (Sandbox Code Playgroud)

进入虚拟功能.

通常 - 如果您需要删除继承的构造函数,那么您可能需要重新考虑/重新设计类层次结构.

  • +1但是为了避免引导OP误入歧途,也许应该指出ctors不应该调用虚函数. (4认同)

adf*_*f88 6

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


class n : m
{
public:
      n() : m(false) { cout << "daughter" << endl; }
};
Run Code Online (Sandbox Code Playgroud)

或者如果您不想公开

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; }
};
Run Code Online (Sandbox Code Playgroud)