当派生类包含基类成员 调用过程
看题
#include <iostream>
using namespace std;
class Base
{ private:
int Y;
public:
Base(int y=0) {Y=y;cout<<"Base("<<Y<<") \n";}
~Base() {cout<<"~Base()\n";}
void print() {cout<<Y<<" ";}
};
class Derived:public Base
{
private:
Base b;
int Z;
public:
Derived (int y, int z):Base(y)
{Z=z;
cout<<"Derived("<<y<<","<<z<<")\n";
}
~Derived() {cout<<" ~Derived()\n";}
void print()
{
Base::print();
cout<<Z<<endl;
}
};
int main()
{
Derived d(10,20);
d.print();
}
初始化派生类对象B
1.初始化基类A Base(10)
2.初始化B成员基类b Base(0)
3.执行构造函数体Derived(10,20)
#include<iostream>
using namespace std;
class A
{
public:
A(int i=10){x=i;cout<<"A:"<<x<<endl;}
int x;
};
class B:public A
{
public:
//B(int i,int j):A(i),a(j){x=i;cout<<"B:"<<x<<", "<<A::x<<endl;}
B(int i):a(i){x=i;cout<<"B:"<<x<<", "<<A::x<<endl;}
private:
A a;
int x;
};
int main()
{
B b(5);
}
初始化派生类对象B
1.初始化基类A A:10
2.初始化B成员基类a A:5
3.执行构造函数体B:5,10
总结
构造顺序:
基类构造→派生类的成员对象构造→派生类构造
报错
编译器在尝试构造类
A
的一个对象时,没有找到合适的默认构造函数(不接受任何参数的构造函数)。这个报错告诉我们,定义派生类要么基类有默认构造函数,要么在派生类里需要显式初始化,比如下面这个也报错。
-
基类没有默认构造函数:
如果基类没有默认构造函数,但是提供了带参数的构造函数,那么派生类必须在其初始化列表中显式调用基类的带参数构造函数。(比如第一题)在这种情况下,派生类可以没有默认构造函数,只要确保每次创建派生类对象时都提供正确的初始化参数。
修改显式调用
上强度看看你能不能读懂
首先构造积累这里是B中显示构造 A5
成员对象构造A6
B的构造函数B5,5
今天你博学了吗?