不清楚“继承父构造函数”是什么意思。使用overriding(覆盖)一词表示您可能正在考虑行为类似于多态虚拟函数的构造函数。我故意不使用“虚拟构造函数”一词,因为这是一种代码模式的通用名称,其中您实际上需要一个对象的现有实例来创建另一个实例。
在“虚拟构造函数”模式之外,多态构造函数几乎没有用,因此很难提出一个具体的场景,在这种情况下可以使用实际的多态构造函数。一个非常人为的例子,它甚至都不是远程有效的C ++:
struct Base {
virtual Base(unsigned p1, unsigned p2) {...}
};
struct Derived: public Base {
Derived(unsigned p1, unsigned p2) : Base(p1, p2) override {...}
};
int main(void) {
unsigned p1 = 0;
unsigned p2 = 42;
Derived *p_d1 = new Base(p1, p2); // This might call Derived(unsigned, unsigned).
Derived *p_d2 = nullptr;
p_d2 = new Base(p1, p2); // This might call Derived(unsigned, unsigned) too.
}
在这种情况下,调用的构造函数取决于正在构造或分配的变量的具体类型。它在解析/代码生成期间检测很复杂,并且没有实用程序:您知道要构造的具体类型,并且为派生类编写了特定的构造函数。以下有效的 C ++代码具有完全相同的功能,但略短一些,并且在其作用上更加明确:
struct Base {
Base(unsigned p1, unsigned p2) {...}
};
struct Derived: public Base {
Derived(unsigned p1, unsigned p2) : Base(p1, p2) {...}
};
int main(void) {
unsigned p1 = 0;
unsigned p2 = 42;
Derived *p_d1 = new Derived(p1, p2);
Derived *p_d2 = nullptr;
p_d2 = new Derived(p1, p2);
}
第二个解释或也许是附加的问题是-如果基类构造函数自动出现在所有派生类中,除非被显式隐藏,该怎么办?
如果孩子确实继承了父构造函数,那会出错吗?
您将不得不编写其他代码来隐藏父构造函数,该父构造函数在构造派生类时使用不正确。当派生类以某种无关紧要的方式专门化基类时,可能会发生这种情况。
典型的示例是矩形和正方形(请注意,正方形和矩形通常不能用Liskov替代,因此它不是一个很好的设计,但它突出了这个问题)。
struct Rectangle {
Rectangle(unsigned width, unsigned height) {...}
};
struct Square : public Rectangle {
explicit Square(unsigned side) : Rectangle(side, side) {...}
};
如果Square继承了Rectangle的二值构造函数,则可以构造具有不同高度和宽度的正方形...这在逻辑上是错误的,因此您想隐藏该构造函数。