这是一些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的构造函数。我该怎么办?
答案 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)
两种解决方案:
请勿从n
派生m
。检查您是否确实具有接口重用(您依赖于多态接口)而不是实现重用。在后一种情况下,更喜欢将m*
成为n
的成员,然后在需要时仅创建m
对象。这将是我的首选解决方案。
您可能不希望调用m
的构造函数,因为它执行了您不想要的操作。将您不想执行的代码从m
构造函数移动到专用的init()
函数等中,然后根据需要调用它。我不建议这样做,因为你最终得到一个有状态的界面。
答案 4 :(得分:0)
任何类的对象都包含其所有超类的子对象。并且所有这些必须必须在构造主要对象之前构建。这个结构的一部分是调用基类构造函数之一,它不能省略。您只能选择要调用的构造函数。