我们在C ++中“继承”构造函数吗?什么是“继承”的确切定义

时间:2013-11-17 11:02:23

标签: c++ inheritance constructor theory

我想知道为什么人们会说:

“继承类不会继承构造函数”。

如果可以使用父类的构造函数,则无论如何都会自动调用无参数构造函数。

示例:

#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 ++中继承?编程语言中“继承”的确切定义是什么?

提前致谢。

5 个答案:

答案 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 ++中构造函数和继承有什么令人沮丧的东西?一些人(包括我自己)的一个共同答案是,没有自动设施允许从传递类构造函数中获取参数的基类的“传递”构造,而无需明确声明和定义后者。