子类不能自动继承父类的构造函数,本质原因是什么

milunhailili 2010-08-04 11:27:03
RT.

问题一:

以前是做Delphi的,构造函数是自动被子类使用的.

今天开始学C++,发现题目所说的问题.

表面原因我能想到的是构造函数名称不一样.但是这一点我觉得编译器完全可以特殊处理一下.没必要把这一步留给开发人员,所以我觉得父子构造函数名称不一样并非其真正的原因.

作为对子类可见方法,子类可以直接调用.为什么构造函数不能?


问题二:
C++中如何调用父类的同名方法.这个方法可能已经被子类override;
C#中用super,Delphi用中inherited C++用怎么用?
...全文
1283 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
xixiaoliu 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 akirya 的回复:]
引用 18 楼 xixiaoliu 的回复:

class B : public A
{
public:
B() : A() // 这种方式会在 C++ 1x 被支持
{
// ...
}
}

现在不就是这个语法么。。
[/Quote]

啊,我搞错了,,,我原想说的是构造函数调用自己的构造函数。。
pengzhixi 2010-08-05
  • 打赏
  • 举报
回复
1.如果是默认构造函数的话,那么基类的肯定是会被派生类构造函数默认调用的。但是如果是含参数的呢?LZ有没有考虑这个问题。

2.父类名::函数名
cattycat 2010-08-05
  • 打赏
  • 举报
回复
你得自己指明调用父类的哪个构造函数,如果你父类有多个重载的构造函数的话。
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 milunhailili 的回复:]

上面有同学提到多继承的问题.
如果自动继承的话,这样确实可能在子类产生同名同参构造器,不过可以加个前缀就可以了,毕竟这样的情况不多.
因为对C++知道的不多,我不清楚现在C++中普通的方法在多继承中,如果父类出现同名同参数方法,那在子类是怎么处理的,我想也是加前缀处理的吧.或者可以重新在子类重命名.不得而知.
[/Quote]

C++是你得自己指明父类用哪个构造函数,不管单继承还是多继承。不会自动调用父类同参数的。
milunhailili 2010-08-05
  • 打赏
  • 举报
回复
上面有同学提到多继承的问题.
如果自动继承的话,这样确实可能在子类产生同名同参构造器,不过可以加个前缀就可以了,毕竟这样的情况不多.
因为对C++知道的不多,我不清楚现在C++中普通的方法在多继承中,如果父类出现同名同参数方法,那在子类是怎么处理的,我想也是加前缀处理的吧.或者可以重新在子类重命名.不得而知.
xiazdong 2010-08-05
  • 打赏
  • 举报
回复
1.因为子类的构造函数在默认情况下会先调用基类的构造函数,但如果基类有多个构造函数,要调用哪个需要自己来选择,因此不用继承,只需自己调用
class A

public:
A(int the_a);
private:
int a ;
};
class B:public A
{
public:
B(int the_a,int the_b):A(the_a);
private:
int b;
};
2.当重名时,一般是加作用域限定符:: 但还要考虑就是最好要将基类声明为虚函数,因为这样就可以实现多态性,即指针对象的问题。这个我就省略了。

只是个人看法
pengzhixi 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 milunhailili 的回复:]
引用 16 楼 pengzhixi 的回复:
1.如果是默认构造函数的话,那么基类的肯定是会被派生类构造函数默认调用的。但是如果是含参数的呢?LZ有没有考虑这个问题。

2.父类名::函数名


不管多少个参数,都只是相当于overload而已.有什么问题?
[/Quote]
如果基类函有多个含参的构造函数呢?
mskmc_mc 2010-08-05
  • 打赏
  • 举报
回复
本质在于,基类中不能访问派生类成员
基有自己的类域,该类域只有基类成员或其它地方引进来的成员,基类的域是无法访问派生类域
所以,基类构造只能构造它自己,如果非要构造派生类成员,可能存在一些问题,一是基类必须在派生类构造前构造,而派生类可能还没有建立起子对象,所以可能会出现不明确的构造可构造成员不存在
而派生类域,就像嵌套在基类域中一样,它可以访问继承来的非私有成员,就像访问它自己的成员一样,所以派生类可以构造基类的成员,但这样做很不明确,所以一般都是用派生类的成员初始化表来显式调用基类的构造,来构造基类的成员。
milunhailili 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 pengzhixi 的回复:]
1.如果是默认构造函数的话,那么基类的肯定是会被派生类构造函数默认调用的。但是如果是含参数的呢?LZ有没有考虑这个问题。

2.父类名::函数名
[/Quote]

不管多少个参数,都只是相当于overload而已.有什么问题?
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hpsmouse 的回复:]

说不清楚,只能帮顶了……

这个规定确实不太舒服,有时候本来只是想要稍微派生一下,添一点小小的功能,都得把基类那一堆构造函数全部转发一遍……
[/Quote]
刚查了下 C++ 0x草案里面有个 Inheriting constructors 可以满足楼主的需求。
要是不被否决的话 几年之后就可以用了。
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xixiaoliu 的回复:]

class B : public A
{
public:
B() : A() // 这种方式会在 C++ 1x 被支持
{
// ...
}
}
[/Quote]
现在不就是这个语法么。。
smallgyy 2010-08-05
  • 打赏
  • 举报
回复
自动继承肯定会出现歧义问题,所以才不去使用

在调用父类中于子类同名的函数时, 父类名::同名函数
xixiaoliu 2010-08-05
  • 打赏
  • 举报
回复
class B : public A
{
public:
B() : A() // 这种方式会在 C++ 1x 被支持
{
// ...
}
}
hslinux 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 pengzhixi 的回复:]

1.如果是默认构造函数的话,那么基类的肯定是会被派生类构造函数默认调用的。但是如果是含参数的呢?LZ有没有考虑这个问题。

2.父类名::函数名
[/Quote]












`
icekingson 2010-08-04
  • 打赏
  • 举报
回复
原理:一个有着层次结构的类群组,当派生类的对象诞生之时,构造函数的执行是由最基类至最尾派生类。

我想具体执行基类的什么构造函数,得看派生类如何调用。

比如:

class A
{
private:
char m_name[10];
public:
A();
A(const char *nm){strcpy(m_name,nm);}
};

class B:public A
{
public:
B(const char *nm):A(nm){}
};


这里我们调用的是基类A的A(const char *nm)构造函数,如果不是显性的调用的话,就会调用默认的A()的构造方法..
xkyx_cn 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 milunhailili 的回复:]
在构造函数中需要对成员变量初始化.
这父类的这个初始化操作对子类也是有用的.
所以我构造子类的时候,既然父类已经初始化了,我直接调用父类的就可以达到目标了.
默认的达不到要求.
[/Quote]

既然你在用c++编程,那就请用c++的思维,别的语言技巧很可能会误导你。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 milunhailili 的回复:]

在构造函数中需要对成员变量初始化.
这父类的这个初始化操作对子类也是有用的.
所以我构造子类的时候,既然父类已经初始化了,我直接调用父类的就可以达到目标了.
默认的达不到要求.
[/Quote]
父类多个构造函数怎么办?编译器怎么知道你调用那个?
milunhailili 2010-08-04
  • 打赏
  • 举报
回复
在构造函数中需要对成员变量初始化.
这父类的这个初始化操作对子类也是有用的.
所以我构造子类的时候,既然父类已经初始化了,我直接调用父类的就可以达到目标了.
默认的达不到要求.
  • 打赏
  • 举报
回复
1
有默认构造函数的话不就自动调用了么

2
父类名::方法名
liutengfeigo 2010-08-04
  • 打赏
  • 举报
回复
既然你在用c++编程,那就请用c++的思维
加载更多回复(6)

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧