我想知道为什么人们会说:
“继承类不会继承构造函数”。
如果可以使用父类的构造函数,则无论如何都会自动调用无参数构造函数。
示例:
#include <iostream>
using namespace std;
class A {
private :
int x;
public :
A () {
cout << "I anyway use parameter-less constructors, they are called always" << endl;
}
A (const int& x) {
this->x = x;
cout << "I can use the parent constructor" << endl;
}
};
class B : public A {
private :
int y;
public :
B() {
}
B (const int& x, const int& y) : A (x) {
this->y = y;
}
};
int main() {
B* b = new B(1,2);
B* b1 = new B();
return 0;
}
“说”是否正确,构造函数是否在c ++中继承?编程语言中“继承”的确切定义是什么?
提前致谢。
答案 0 :(得分:4)
他们的意思是构造函数签名不会被继承。
在您的示例中,B
没有构造函数采用单个const int&
,即使它的基类也是如此。从这个意义上讲,它没有“继承”构造函数(但仍然可以使用它)。
答案 1 :(得分:2)
我想知道为什么人们会说:“继承类不会继承构造函数”。
也许最好用一个例子来说明这一点:
struct Foo
{
Foo(int, int) {}
};
struct Bar : Foo
{
};
这意味着没有Bar::Bar(int, int)
构造函数可以调用,尽管在基类中存在具有相同参数列表的构造函数。所以你不能这样做:
Bar b(42, 42);
在C ++ 11中,你实际上可以使用构造函数,但你必须明确它:
struct Bar : Foo
{
using Foo::Foo;
};
现在,您可以说Bar b(42, 42);
答案 2 :(得分:1)
派生类可以/必须看到基类构造函数,以便调用它们,以保持一致性。但是,它们的签名不会在派生类中公开,因此,如果没有显式定义的构造函数,则无法构造该类,该构造函数将所需的参数转发给基类构造函数。
在C ++ 11中,一个可以继承构造函数:What is constructor inheritance?
在C ++中规避'代理构造函数'的另一种方法&lt; 11:How to define different types for the same class in C++
答案 3 :(得分:1)
我认为他们的意思是:
struct A {
A(int, int) { }
};
struct B : public A {
};
int main()
{
A a(1, 2); // ok
B b(1, 2); // error
}
与“非特殊”成员函数进行比较:
struct A {
void f() { }
};
struct B : public A {
};
int main()
{
A a;
B b;
a.f(); // ok
b.f(); // ok too
}
但是,当然,从B
开始,您可以调用可访问的A
构造函数(如自动生成的那样)。析构函数同样如此。
请注意,在C ++ 11中,您可以使用“继承构造函数”功能:
struct A {
A(int, int) { }
};
struct B : public A {
using A::A;
};
int main()
{
A a(1, 2); // ok
B b(1, 2); // ok now
}
答案 4 :(得分:0)
在你的例子中,B的默认(“无参数”)构造函数确实调用了A的默认构造函数,但这并不意味着B“继承”了那个构造函数,只是它“有权访问”它。也就是说,A的默认构造函数可以从B中访问,但是它不能从外部访问(没有人可以使用A的默认构造函数从外部构造B的实例)。
另一种看待它的方法是问,在C ++中构造函数和继承有什么令人沮丧的东西?一些人(包括我自己)的一个共同答案是,没有自动设施允许从传递类构造函数中获取参数的基类的“传递”构造,而无需明确声明和定义后者。