【发布时间】:2021-09-17 07:23:04
【问题描述】:
.h
#ifndef header
#define header
struct base
{
private:
int p,q;
public:
base();
base(const base&);
base operator=(const base&);
~base();
};
struct der: public base
{
private:
int x,y;
public:
der();
der(const der&);
der operator=(const der&);
~der();
};
#endif
.cpp
#include"10.h"
#include<iostream>
base::base()
{
std::cout<<"base ctor- 0 arg\n";
p=0; q=0;
}
base::base(const base &b)
{
std::cout<<"base copy ctor\n";
p=b.p;
q=b.q;
}
base base::operator=(const base &b)
{
std::cout<<"base overloaded=operator\n";
p=b.p;
q=b.q;
return *this;
}
base::~base()
{
std::cout<<"base dctor\n";
}
der::der()
{
std::cout<<"derived ctor- 0 arg\n";
}
der::der(const der &d)
{
std::cout<<"derived copy ctor\n";
x=d.x;
y=d.y;
}
der der::operator=(const der &d)
{
std::cout<<"derived overloaded operator\n";
x=d.x;
y=d.y;
return *this;
}
der::~der()
{
std::cout<<"derived dctor\n";
}
主要
#include"10.h"
#include<iostream>
int main()
{
der d1,d2;
std::cout<<"\n";
d2=d1;
std::cout<<"\n";
der d3=d1;
std::cout<<"\n";
}
输出
base ctor- 0 arg
derived ctor- 0 arg
base ctor- 0 arg
derived ctor- 0 arg
derived overloaded operator
base ctor- 0 arg
derived copy ctor
derived dctor
base dctor
base ctor- 0 arg
derived copy ctor
derived dctor
base dctor
derived dctor
base dctor
derived dctor
base dctor
1.当我没有创建任何基类对象时调用派生类的复制构造函数和重载=运算符时,基类的 0-arg 构造函数是如何调用的?
2.为什么派生类的重载=运算符不调用基类的相应重载=运算符。
3.与为什么派生类的复制构造函数不调用基类的相应复制构造函数类似。
【问题讨论】:
-
当您覆盖一个函数并且该覆盖被执行时,只有该覆盖被执行。如果你想要“执行函数的基本版本,然后也执行这个额外的东西”的行为,你实际上必须写那个。该语言不会自动为您执行此操作。
-
->
der::der(const der &d) : base(d) {/*..*/}. -
@NathanPierson -- 你的观点是正确的:派生类中的函数不会自动调用它们对应的基类函数(构造函数和析构函数除外),但这里没有覆盖。
-
operator=只是一个成员函数;无论你写什么,它都会做。如果你想调用基类版本,你必须自己调用它。派生类的构造函数将调用其基类的构造函数,但如果您不显式调用特定构造函数,编译器将生成调用 default 构造函数的代码。 -
@AbhishekMane - 这是真的。如果那是您想要的,请不要编写赋值运算符或复制构造函数。如果您选择自己编写,则必须告诉编译器您想要什么。如果你编写一个不调用基类构造函数的构造函数,编译器会生成调用默认构造函数的代码。这就是为什么它被称为“默认”。
标签: c++ inheritance copy-constructor