子类继承父类的构造函数(方法)吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子类继承父类的构造函数(方法)吗?相关的知识,希望对你有一定的参考价值。
参考技术A 最近我看见有人问过这个问题。在此我想表达一下自己的观点。根据面向对象中关于继承这个概念子类继承父类所有的属性和方法。那么既然是所有的那么本人认为也应当也包括构造函数(方法)。
我先举一个C++的例子:classParentprivate:intp;public:Parent(void):p(0)Parent(inti):p(i);classChild:publicParentprivate:intc;public:Child(void):Parent(
),c(0)//在这里,创建Child对象时先构造父类域Child(inti):Parent(i+1
),c(i)//同上;
由于构造函数非常特别,对它的调用就像是调用一个C函数一样,而不是利用对象来调用的(若不先构造对象哪儿来的对象?)。因此鉴于这份特殊性我们可以这么考虑:
将上述代码中classChild:publicParent去掉:
public
Parent,我们可以编译试试,是否能成功。事实上正是因为Parent与Child有亲子关系,所以Child构造函数中可以调用Parent的构造函数先对其Parent域进行初始化。这个特点非常符合工程学详见我的文章《我比起Java更喜欢C++的理由语义》。
下面将贴出相应的Java代码:classParentprivateintp;publicParent()p=0;publicParent(inti)p=i;classChildextendsParentprivateintc;publicChild()super();c=0;publicChild(inti)super(i+1);c=i;
我们可以看到,在Java中可以利用super关键字来访问本类父类的构造方法。这样在一定程度上也消除了歧异性比如你也可以在Child类中的某一个方法中这么写:Parent
p
=
new
Parent();而利用super()就表示了子类在初始化本类域前先初始化其父类域。这也可以证明在Java中子类继承父类构造方法,并且子类可以通过super来访问父类的构造方法,只要父类的构造方法不是private。
C++中,子类会继承父类的虚函数表!对于父类的析构函数(虚函数) 也会继承吗?
一个子类继承了父类的虚函数表,而且父类的析构函数是虚函数,那么这个虚函数会放到父类的虚函数表中吗?子类继承时,这个虚函数表中是否有父类的析构函数?如果继承了这个父类的析构函数,那么子类的析构函数也是虚函数的时候,子类的虚函数是否会替换父类的虚函数。如果不替换,那么子类在使用调用析构函数时,是直接调用虚函数表中的子类析构函数吗?如果子类的的虚函数表中有父类的析构函数,看起来这个父类析构函数的存在似乎没有任何意义!!!……求大神解答!!!
上面的问题,楼上已经回答啦!我来说说这个意义吧!如果子类的的虚函数表中有父类的析构函数,看起来这个父类析构函数的存在似乎没有任何意义!!
类是否需要一个虚析构函数?
如果一个类,有子类那么这个类就应该需要一个虚析构函数。虚函数也只有在继承的时候才会有用的。
说个例子:
class A
string t;
;
class B:A
string s;
;
int main()
A* bp=new B; //这句话是没有问题的吧!
delete bp; //但是这句话就会报错啦、除非你在A里面加上虚析构函数。
return 0;
这个就是他的意义吧!这个例子不是我原创的,来自《c++沉思录》 参考技术A 只要是父类的函数, 子类都会继承, 包括折构函数
而父类的函数是虚构函数的时候, 子类如果不重新定义该函数, 则正常继承. 否则覆盖了父类的盖函数
回到你的问题, 如果父类折构函数是虚函数, 子类继承的时候, 其折构函数首先默认是父类的折构函数, 如果子类重新定义了折构函数, 那就不再使用父类的, 但函数名字不变.
折构函数 是指 可以被子类重定义; 折构函数 是实现一个功能的函数. 2个层次不一样.追问
谢谢!……您的意思是当子类继承父类的虚析构函数时,子类的虚函数表中会有这个父类是析构函数 的,不过您说当子类重新定义虚析构函数时,子类不在使用父类的析构函数 的意思是 子类的虚函数表中 多了一项子类的虚函数地址还是说虚函数表中原来父类的虚函数地址 被子类的替代了???
参考技术B 不会自己创以上是关于子类继承父类的构造函数(方法)吗?的主要内容,如果未能解决你的问题,请参考以下文章