子类隐藏父类的构造函数

child class hides parent class's constructor

本文关键字:构造函数 父类 隐藏 子类      更新时间:2023-10-16

我有一个继承类P 的类C

template <typename T>
class P{
  public:
  P();
  P(T* sometype);
};
class C: public P<sometype>{
};

现在C会隐藏P(sometype*)构造函数吗?但我需要P(ometype*)构造函数在C中可用。我需要编写另一个调用父构造函数的C(sometype*)吗?或者有一些简单的突破。而我没有;我不想使用C++11功能。

是的,构造函数不是继承的。你需要为C:写一个新的

template <typename T>
class C : public P<T> {
public:
  C(T* sometype) { /*...*/ }
};

此外,请注意,您对标识符sometype的使用是不一致的。在P的情况下,您将其用作变量名,在C中,它是一个类型名,但尚未声明。

另一个问题是C的构造函数将如何处理sometype对象。我怀疑它将完全像P的构造函数所做的那样,而且由于您无论如何都需要调用基类的构造函数,因此C构造函数的实现很可能如下所示:

template <typename T>
class C : public P<T> {
public:
  C(T* sometype):P<T>(sometype) { }
};

最后一句话:C++11实际上提供了构造函数继承作为一个特性。由于您对使用C++11特性不感兴趣(尽管这确实是一个遗憾),而且许多编译器还没有实现该特性,因此我不会详细介绍。此处提供了对功能定义的引用。

如果您需要通过子类型指定基类type T,请尝试以下操作:

template<typename T>
class C : public P<T> {
  public:
    C(T* pT): P(pT) {}
}
int* pMyInt;
C<int> myClass(mMyInt);

您应该编写一个C的构造函数,它接受相同的参数并将其传递给其父类,如下所示:

C(T* sometype)
    : P(sometype)
{
}

现在C会隐藏p(sometype*)构造函数吗?

是的,在C不继承p的构造函数的意义上。因此,C将没有父类的构造函数可供该类的用户使用。

但我需要p(ometype*)concstructor在C 中可用

这是可能的:你只需直接称之为:

P::P(sometype*)