-
公有继承 class A:public B 保护继承 class A:protected B 私有继承 class A:private B 公有继承时基类中各成员属性保持不变,基类中private成员被隐藏。 派生类的成员只能访问基类中的public/protected成员,不能访问private成员; 派生类的对象只能访问基类中的public成员。 保护继承时基类中各成员属性均变为protected,且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,不能访问private成员;派生类的对象不能访问基类中的任何的成员。 私有继承时基类中各成员属性均变为private,且基类中private成员被隐藏。派生类的成员也只能访问基类中的public/protected成员,不能访问private成员 派生类的对象不能访问基类中的任何的成员。查看全部
-
这里老师讲的不对, 如果存在多继承.那么初始化子类的时候肯定先需要调用父类的析构函数.但是先调用哪个父类的析构函数.此顺序不取决于初始化列表,而是取决于你继承的顺序.比如 class A : public B, public C { A(b,c):C(c),B(b); }; 上面的例子,A先继承了B,再继承C.但是初始化列表中先初始化了C,再初始化B.但是B和C的执行顺序确实 B - C - A . 可见多继承的父类初始化顺序应该和继承顺序有关.查看全部
-
多继承是一个对象继承多个对象,多重继承是一个对象层层继承上一个对象就像是孙子通过多重继承爷爷一样。每个子类都是父类的一个对象(isA),孙子也可以是爷爷的一个对象(也是 isA 关系) 实例化孙子类,会先执行爷爷的构造函数,在执行爸爸的构造函数,最后执行孙子的构造函数。销毁的时候,按照构造函数的逆序执行,先执行孙子的析构函数,在执行爸爸的析构函数,最后执行爷爷的析构函数。查看全部
-
不是虚继承的情况下,实例化子类对象的时候,要分别执行其2个父类的父类构造函数,再分别执行2个父类的构造函数,因为继承关系中,必须实例化父类对象后(执行父类的构造函数)才能实例化子类对象(执行子类的构造函数),销毁的时候也要分别执行这个子类2个父类的析构函数及父类各自的父类的析构函数。<br> 用了虚继承后只执行一次爷爷构造函数一次爸爸构造函数(2个爸爸构造函数都只执行一次)一次孙子构造函数,爷父孙析构函数也是只执行一次。<br> 虚继承的情况下菱形继承作为最顶层的父类并没有进行参数的传递,也就是参数只使用了顶层父类的默认参数而无法从子类中获得传入的参数 正因为继承了2个爷爷的数据成员才能给他赋2个值,如果只有1个数据成员就只能得到一个值。继承到2个值是因为2个爸爸类分别继承爷爷类的数据成员,在继承给孙子类,孙子类就得到了2个爷爷类的数据成员,本质上是爸爸类分别有一个爷爷类的数据成员。(用虚继承解决)查看全部
-
啦呵呵查看全部
-
公有成员可以直接访问,可以间接通过自身类的公有函数访问,也可以通过子类的公有函数访问
保护成员不可以直接访问,可以间接通过自身类的公有函数访问,也可以通过子类的公有函数访问
私有成员不可以直接访问,可以间接通过自身类的公有函数访问,不可以通过子类的公有函数访问
private不能继承、类外不能访问,protected能继承,类外不能访问,public能继承、类外能访问。总结:权限:类外访问 < 继承 < 类内访问。
查看全部 -
Person *p=new Soldier;//用父类Person的指针指向堆中分配的子类Soldier的对象 delete p; p=NULL;//只执行父类的析构函数,而不执行子类的析构函数,可能导致内存泄露
【如何在这种情况下防止内存泄露?】
虚析构函数:当存在继承关系,且要用一个父类的指针指向堆中子类的对象,并希望用父类的指针释放这块内存时,可以使用。
class Person{ Person(); virtual~Person(); //前面加关键字virtual即可,这个关键字可以被继承下去 } //在Soldier.h中,即使在~Soldier前面不写virtual,也相当于有了这个关键字(被继承下来了)
查看全部 -
基类又叫做“父类”、“超类”;派生类又叫做“子类”、“继承类”。 另外做一个小科普,Java中继承只用关键字Extends: class C extends S{ //to do };查看全部
-
①通过public继承的都是被继承为派生类中所对应的访问属性(private例外),
如:基类public通过public继承为派生类中public;
基类protected通过public继承为派生类中protected‘
基类private通过public继承为无法访问。
②通过protected继承的都是被继承为派生类中的protected访问属性(private例外),
如:基类public通过通过protected继承为派生类中protected;
基类protected通过protected继承为派生类中protected;
基类private通过protected继承为无法访问。
③通过private继承的都是被继承为派生类中的protected访问属性(private例外),
如:基类public通过通过private继承为派生类中private;
基类protected通过private继承为派生类中private;
基类private通过private继承为无法访问。
查看全部 -
父类的指针指向子类对象的时候 只能访问子类中父类原有的成员,而无法访问子类中独有的数据成员和成员函数 子类对象向父类对象赋值。或用子类对象初始化父类对象,本质是将子类当中从父类继承下来的数据成员赋值给父类对象,而其他的数据将会被截断,丢失。 父类指针指向子类对象。父类指针只能访问父类原有的成员。查看全部
-
在最底层的类,要实例化对象,就必须执行继承量当中的每一个类<br> 在销毁的时候,逆序执行 无论继承有多少级,只要保持间接或者直接的关系,子类都可与自己的直接父类,或者是间接父类,称之为is a 的关系,并且能够通过父类的指针对直接子类或者是间接子类的对象进行操作查看全部
-
void test1(Person p){p.play}调用test1的时候,因为在test1中所定义的参数是一个对象P,所以传值的时候会先实例化临时对象P,通过临时对象P调用play这个函数,在test1执行完毕之后,p这个临时对象就会被销毁 如果函数的参数是基类的对象,那么基类的对象和派生类的对象,都可以作为实参传递进去,并且可以正常使用。 void test2(Person &p) 没有实例化临时对象,使用基类的引用也可以接收基类的对象以及派生类的对象 void test3(Person *p)的调用结果和void test2(Person &p)一样 因为不产生临时变量,所以void test3(Person *p)、void test2(Person &p)效率更高查看全部
-
遇到一个小问题,在使用#include<string>时,需要配套使用using namespace std;才可正常使用string,否则会出错,也就是string类型应该是在std命名空间。以前一直仅把他当作#include<iostream>使用cout时的命名空间,现在想来应该是同名的命名空间。public Soldier : public Person<br> {<br> }<br> 注意只有一个':',不是两个. 使用string类型必须包含<string> 声明类的最后要加分号. undefined reference问题:一般是少了目标文件 g++ 编译时要加入所有相关的.o文件 include包含头文件时注意双引号“”和尖括号<>是不同的,编译器会搜索不同的路径 (1)尖括号<>是引用C++自身文件库里的头文件,如<iostream> (2)双引号“”则是引用用户自己编写的头文件,如“Person.h”查看全部
-
类中成员函数可访问protected和private成员。 类的对象不能访问protected和private成员。 公有继承的派生类的成员函数可访问基类中的protected成员,不可访问基类中的private成员。查看全部
-
公有成员可以直接访问,可以间接通过自身类的公有函数访问,也可以通过子类的公有函数访问 保护成员不可以直接访问,可以间接通过自身类的公有函数访问,也可以通过子类的公有函数访问 私有成员不可以直接访问,可以间接通过自身类的公有函数访问,不可以通过子类的公有函数访问查看全部
举报