构造函数、析构函数、重载的 =operator 函数、复制构造函数不会被继承。这到底是什么意思?
Constructor, destructor, overloaded =operator function, copy constructor do not get inherited. What this exactly means?
代码
#include<iostream>
struct A
{
~A()
{
std::cout<<"dctorA\n";
}
};
struct B: public A
{
~B()
{
std::cout<<"dctorB\n";
}
};
int main()
{
B b1;
b1.~A();
}
输出
dctorA
dctorB
dctorA
如果析构函数没有继承,那么我如何通过 B 的对象调用它?
我知道三和五规则,但编译器的工作取决于是否遵循规则。所以为了避免复杂性,我避免编写复制构造函数和重载=运算符。
该语句试图说明的是,当您添加 A::A(int)
时,class B
不会自动获得构造函数 B::B(int)
。同样,当您有 A::operator=(int)
.
时,不会自动生成 B::operator=(int)
可以自动生成复制构造函数B::B(B const&)
,在这种情况下需要A::A(A const&)
。但是你从参数中看到它是生成的,而不是继承为 B::B(A const&)
.
析构函数的工作方式相同 - 生成,而不是继承 - 但由于没有参数,因此不那么明显。
代码
#include<iostream>
struct A
{
~A()
{
std::cout<<"dctorA\n";
}
};
struct B: public A
{
~B()
{
std::cout<<"dctorB\n";
}
};
int main()
{
B b1;
b1.~A();
}
输出
dctorA
dctorB
dctorA
如果析构函数没有继承,那么我如何通过 B 的对象调用它?
我知道三和五规则,但编译器的工作取决于是否遵循规则。所以为了避免复杂性,我避免编写复制构造函数和重载=运算符。
该语句试图说明的是,当您添加 A::A(int)
时,class B
不会自动获得构造函数 B::B(int)
。同样,当您有 A::operator=(int)
.
B::operator=(int)
可以自动生成复制构造函数B::B(B const&)
,在这种情况下需要A::A(A const&)
。但是你从参数中看到它是生成的,而不是继承为 B::B(A const&)
.
析构函数的工作方式相同 - 生成,而不是继承 - 但由于没有参数,因此不那么明显。