关于C++继承中派生类与基类的构造函数的问题。
基类Basic(一个数据成员)中有两个构造函数,一个构造函数是无参的默认构造函数,一个构造函数需要提供参数值。比如Basic(){a=1;};Basic(intx){a=...
基类Basic(一个数据成员)中有两个构造函数,一个构造函数是无参的默认构造函数,一个构造函数需要提供参数值。比如Basic(){a = 1;}; Basic(int x){a = x;};
而派生类derived(增加了一个数据成员)中有四个构造函数。
一个是默认构造函数,并且其调用基类的默认构造函数;
一个是默认构造函数,但是调用基类中有参的那个构造函数;
一个有参构造函数,并调用基类的默认构造函数;
一个有参构造函数,并调用基类的有参构造函数
------------------------------------------------
求这四个派生类的构造函数怎么写? 展开
而派生类derived(增加了一个数据成员)中有四个构造函数。
一个是默认构造函数,并且其调用基类的默认构造函数;
一个是默认构造函数,但是调用基类中有参的那个构造函数;
一个有参构造函数,并调用基类的默认构造函数;
一个有参构造函数,并调用基类的有参构造函数
------------------------------------------------
求这四个派生类的构造函数怎么写? 展开
展开全部
构造函数重载的3个条件:具有相同的名字;参数个数不同;参数类型不同。
所以第2个构造函数不可能实现。
当然如果derived中新增的数据成员不为int型,则可以用以下方式设计构造函数
#include <iostream>
using namespace std;
class Basic
{
private:
int a;
public:
Basic()
{
a = 1;
}
Basic(int x)
{
a = x;
}
int getA()
{
return a;
}
};
class Derived : public Basic
{
private:
double b;
public:
Derived():Basic()
{
b = 1;
}
Derived(int x):Basic(x)
{
b = 1;
}
Derived(double y):Basic()
{
b = y;
}
Derived(int x, double y):Basic(x)
{
b = y;
}
double getB()
{
return b;
}
};
int main()
{
Derived d1;
Derived d2(2);
Derived d3(3.4);
Derived d4(5, 6.7);
cout << "a=" << d1.getA() << " b=" << d1.getB() << endl;
cout << "a=" << d2.getA() << " b=" << d2.getB() << endl;
cout << "a=" << d3.getA() << " b=" << d3.getB() << endl;
cout << "a=" << d4.getA() << " b=" << d4.getB() << endl;
return 0;
}
所以第2个构造函数不可能实现。
当然如果derived中新增的数据成员不为int型,则可以用以下方式设计构造函数
#include <iostream>
using namespace std;
class Basic
{
private:
int a;
public:
Basic()
{
a = 1;
}
Basic(int x)
{
a = x;
}
int getA()
{
return a;
}
};
class Derived : public Basic
{
private:
double b;
public:
Derived():Basic()
{
b = 1;
}
Derived(int x):Basic(x)
{
b = 1;
}
Derived(double y):Basic()
{
b = y;
}
Derived(int x, double y):Basic(x)
{
b = y;
}
double getB()
{
return b;
}
};
int main()
{
Derived d1;
Derived d2(2);
Derived d3(3.4);
Derived d4(5, 6.7);
cout << "a=" << d1.getA() << " b=" << d1.getB() << endl;
cout << "a=" << d2.getA() << " b=" << d2.getB() << endl;
cout << "a=" << d3.getA() << " b=" << d3.getB() << endl;
cout << "a=" << d4.getA() << " b=" << d4.getB() << endl;
return 0;
}
展开全部
函数重载要求:1.函数名相同;2.参数类型或者个数不同。
成员函数重载也是一样,故第二种情况和第三种情况不是重载,所以只能存在一种情况,如下:
class Basic
{
private:
int a;
public:
Basic(){a = 1;}
Basic(int x){a = x;}
};
class derived:public Basic
{
private:
int b;
public:
derived():Basic(){b = 0;} //一个是默认构造函数,并且其调用基类的默认构造函数
derived(int m):Basic(m){b = 0;} //一个是默认构造函数,但是调用基类中有参的那个构造函数
derived(int m):Basic(), b(m){} //一个有参构造函数,并调用基类的默认构造函数
derived(int m, int n):Basic(m), b(n){} //一个有参构造函数,并调用基类的有参构造函数
};
成员函数重载也是一样,故第二种情况和第三种情况不是重载,所以只能存在一种情况,如下:
class Basic
{
private:
int a;
public:
Basic(){a = 1;}
Basic(int x){a = x;}
};
class derived:public Basic
{
private:
int b;
public:
derived():Basic(){b = 0;} //一个是默认构造函数,并且其调用基类的默认构造函数
derived(int m):Basic(m){b = 0;} //一个是默认构造函数,但是调用基类中有参的那个构造函数
derived(int m):Basic(), b(m){} //一个有参构造函数,并调用基类的默认构造函数
derived(int m, int n):Basic(m), b(n){} //一个有参构造函数,并调用基类的有参构造函数
};
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在派生类构造函数的初始化列表中显式调用基类的构造函数即可
例如第一种情况
derived() : Basic() {}
第二种情况:
derived() : Basic(10) {}
以下类推即可
例如第一种情况
derived() : Basic() {}
第二种情况:
derived() : Basic(10) {}
以下类推即可
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一个是默认构造函数,并且其调用基类的默认构造函数;
一个是默认构造函数,但是调用基类中有参的那个构造函数;首先有两个默认构造函数是不可能实现 的
一个是默认构造函数,但是调用基类中有参的那个构造函数;首先有两个默认构造函数是不可能实现 的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、derived(){b=2;}
2、写不出来
3、derived(int d):{b=d;}
4、derived(int x,int y):Basic(x){b=y;}
2、写不出来
3、derived(int d):{b=d;}
4、derived(int x,int y):Basic(x){b=y;}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询