[英]Not calling base class constructor from derived class
假设我有一个基类:
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
向 A 构造函数添加一个true
默认 bool 参数,并在 B 中传递一个false
给它:
class A
{
public:
A(bool construct = true) {
if (!construct) return;
bar();
}
virtual void bar() { cout << "A::bar" << endl; }
};
class B : public A
{
public:
B() : A(false) { bar(); }
void bar() override { cout << "B::bar" << endl; }
};
int main()
{
A a;
B b;
}
输出:
A::bar
B::bar
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.