我们在C++"inherit"构造函数吗?什么是"inheriting"的确切定义
Do we "inherit" constructors in C++ ? What's is exact definition of "inheriting"
我想知道为什么人们说:
"继承类不继承构造函数"。
如果你可以使用父类的构造函数,并且无论如何都会自动调用无参数构造函数。
例:
#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;
}
http://ideone.com/e.js/6jzkiP
那么"说"构造函数在 c++ 中继承是正确的吗?编程语言中"继承"的确切定义是什么?
提前谢谢。
我想知道为什么人们说:"继承类不继承构造函数"。
也许最好用一个例子来说明这一点:
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);
它们的意思是构造函数签名不是继承的。
在您的示例中,B
没有采用单个const int&
的构造函数,即使它的基类采用。从这个意义上说,它没有"继承"构造函数(但仍然可以使用它)。
我认为他们的意思是:
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
}
派生类可以/必须看到基类构造函数才能调用它们,以实现一致性。但是,它们的签名不会在派生类中公开,因此,如果没有显式定义的构造函数,就无法构造类,该构造函数将所需的参数转发给基类构造函数。
在 C++11 中,可以继承构造函数:什么是构造函数继承?
规避C++ <11 中"代理构造函数"的另一种方法:如何在C++中为同一类定义不同的类型
在您的示例中,B 的默认(如您所说"无参数")构造函数确实调用了 A 的默认构造函数,但这并不意味着 B "继承"了该构造函数,只是它"有权访问"它。 也就是说,A 的默认构造函数可以从 B 内部访问,但不能从外部访问(没有人可以从外部使用 A 的默认构造函数来构造 B 的实例)。
另一种看待它的方法是问,C++中的构造函数和继承有什么令人沮丧的地方? 有些人(包括我自己)的一个常见答案是,没有自动工具允许基类的"直通"构造,从派生类构造函数中获取参数,而无需显式声明和定义后者。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 我应该使用什么来代替void作为变体中的替代类型之一
- 我们在C++"inherit"构造函数吗?什么是"inheriting"的确切定义