为什么我可以将派生类对象的引用传递给基类构造函数而不会出现任何编译错误?

时间:2018-02-02 17:02:11

标签: c++ inheritance constructor copy-constructor default-constructor

在A类中,我没有定义任何带参数的构造函数。在类B中,它是类A的派生类,我定义了一个复制构造函数,它将B的引用传递给A的构造函数。看到这段代码传递了编译并且输出在下面是很奇怪的。有人可以解释一下吗?

// Example program
#include <iostream>
#include <string>

class A{
  public:
    A(){ std::cout<<"A constructor called"<<std::endl;};
    ~A(){};
};

class B:private A{
  public:
    B(){std::cout<<"B default constructor called"<<std::endl;};

    B(const B& b): A(b){std::cout<<"B constructor called"<<std::endl;};
};

int main()
{
  B b{};
  B b2{b};
  return 0;
}

输出

 A constructor called
 B default constructor called
 B constructor called

2 个答案:

答案 0 :(得分:3)

A(b)调用A中的复制构造函数,它是由编译器为您提供的。

通过写作来了解自己

A(const A& a) {std::cout << "A copy constructor called\n";}
课程A中的

。这是完全定义良好的C ++。

答案 1 :(得分:0)

我问过后五分钟就知道了。它实际上是调用由编译器

创建的A的复制构造函数