假设我有一个基类:
class baseClass
{
public:
baseClass() { };
};
还有一个派生类:
class derClass : public baseClass
{
public:
derClass() { };
};
当我创建
derClass
的实例时,会调用 baseClass
的构造函数。我怎样才能防止这种情况发生?
创建一个额外的空构造函数。
struct noprapere_tag {};
class baseClass
{
public:
baseClass() : x (5), y(6) { };
baseClass(noprapere_tag()) { }; // nothing to do
protected:
int x;
int y;
};
class derClass : public baseClass
{
public:
derClass() : baseClass (noprapere_tag) { };
};
基类实例是任何派生类实例的组成部分。如果成功构造派生类实例,根据定义,您必须构造所有基类和成员对象,否则派生对象的构造将会失败。构造基类实例涉及调用其构造函数之一。
这是 C++ 中继承工作原理的基础。
工作程序示例
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"a\n";
}
A(int a)
{}
};
class B:public A
{
public:
B() : A(10)
{
cout<<"b\n";
}
};
int main()
{
new A;
cout<<"----------\n";
new B;
return 0;
}
输出
a
----------
b
您可能想要创建一个受保护的(可能为空)默认构造函数,该构造函数将由派生类使用:
class Base {
protected:
Base() {}
public:
int a;
Base(int x) {a = 12;}
};
class Derived : Base {
public:
Derived(int x) {a = 42;}
};
这将阻止任何外部代码使用默认的
Base
构造函数(因此无法正确初始化 a
)。您只需要确保在 Base
构造函数中初始化所有 Derived
字段即可。