Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;编译器创建的默认构造函数_C++ - Fatal编程技术网

C++ c++;编译器创建的默认构造函数

C++ c++;编译器创建的默认构造函数,c++,C++,我最近发现了这个页面()。我尝试了一些代码: class Base { }; class Derived : public Base { }; int main() { Derived d; Base& b = d; } 我知道编译器在基类中创建构造函数、移动构造函数、复制构造函数和析构函数,并且只在派生类中创建构造函数,因为基类中并没有虚拟析构函数。但当我加上 public : ~Base(){} 然后 public : virtual ~Base(){} 我

我最近发现了这个页面()。我尝试了一些代码:

class Base {
};

class Derived : public Base {
};

int main() {
  Derived d;
  Base& b = d;
}
我知道编译器在基类中创建构造函数、移动构造函数、复制构造函数和析构函数,并且只在派生类中创建构造函数,因为基类中并没有虚拟析构函数。但当我加上

public :
  ~Base(){}
然后

public :
  virtual ~Base(){}

我在构造器中看到了一些差异。在第一次添加之后,编译器还会在驱动类中生成move assimment操作符和析构函数,在第二次添加之后—虚拟析构函数、assimment操作符和move assimment操作符。为什么?

Base&b=d只需记住一个地址(作为参考),没有涉及构造函数或析构函数。请比“我看到了一些差异”更具体——将它们包括在您的问题中。需要设置指向vtable的指针,这可能就是您所看到的。“并且只有派生类中的构造函数才是因为没有虚拟析构函数”-啊,不会。派生类不会因为基类有一个非虚拟析构函数而失效。它仍然有自己的一个。但是如果它不可多态,如果我很好地记住C++成员的生成,那么赋值操作符也会比复制构造函数同时生成。我说的是操作符=(const&);