c++ 子类与父类的构造函数继承关系

Posted Bigben

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 子类与父类的构造函数继承关系相关的知识,希望对你有一定的参考价值。

规范上,子类构造函数肯定是会调父类的构造函数。
 
如果代码中没写,就会隐含调用父类的默认构造函数(即那个无参构造函数)。如果父类没有,编译报错。
 
1,展示了当子类要调用父类中带参数的构造函数 时:
#include <iostream>
#include <cstdio>

class A 
public:
    A()  printf("A(void) \\n"); 
    A(int d)  printf("A %d\\n", d); 
    ~A()  printf(" ~A \\n"); 
;

class B : public A 
public:
    B() 
        printf("B(void) \\n");
    

    B(int x) : A(x) 
        printf("B \\n");
    

    ~B()  printf("~B \\n"); 
;

int main(int argc, char* argv[]) 
    B c;
    B b(8); // This also automatically calls the same signature constructor of A
    return 0;
2,如果子类没有调用父类,
以前的
    B(int x) : A(x)
        printf("B \\n");
   
改成了
    B(int x) : A(x)
        printf("B \\n");
   
这是默认调用 A() 这个构造。
 
如果去掉 A() printf("A(void) \\n"); 构造, 
    B(int x) : A(x)
        printf("B \\n");
   
这个编译不过。因为没有默认 A()了。
 
 
输出结果:
 
 
 
 
 
一句一句分析:
 
B  c;         
 
//首先调用A的无参(默认)构造函数,然后调用B的无参构造函数。
 
//所以先输出A(void),然后是B(void)
 
 
 
B  b(8);    
 
//首先调用A的有参构造函数,然后调用B的有参构造函数。
 
//所以先输出A 8,然后是B
 
 
 
 
 
如果,没有显示调用A的有参构造函数呢? 
 
答案是:不会调用A的有参构造函数,只会调用A的无参(默认)构造函数。如下图:
 
 
 
 
 
 
 
 
 
 
 
========================
 
 
 
 
 
 
————————————————
版权声明:本文为CSDN博主「奔跑的龙少」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shine_journey/article/details/53188682

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 不会自己创

以上是关于c++ 子类与父类的构造函数继承关系的主要内容,如果未能解决你的问题,请参考以下文章

C++中子类从基类都继承啥?

简述在类的继承关系中,子类可以继承父类的都有哪些成员

java 子类与父类

子类构造器与父类构造器

C++中,子类会继承父类的虚函数表!对于父类的析构函数(虚函数) 也会继承吗?

java 子类与父类转换