19 类的继承简单地说下C++类的3种继承方式,分别是
public继承
protected继承
private继承
继承就是为了修改父类访问权限,可以理解为一种安全的保护
using namespace std;
class Parent{
private:
int a;
protected:
int b;
public:
Parent(){
cout<<"Parent的构造方法被调用"<<endl;
a = 1;
b = 2;
c = 3;
};
int c;
};
class Child : privateParent{
//能够访问的属性 b c
public:
Child(){
cout<<"Child的构造方法被调用"<<endl;
};
void accessB(){
cout<<b<<endl;
};
};
class Sunzi: public Child{
//能够访问的属性 无法访问Parent里面的任何属性
public:
Sunzi(){
cout<<"Sunzi的构造方法被调用"<<endl;
};
};
20 静态static
通过类名可以直接调用
类里面:静态的常量和方法
21 名称空间namespace
22 内联函数inline 说明这个函数是内联的,在编译过程中内联函数会直接被源代码替换,提高执行效率如果类中的某个函数会被调用很多次或者放在循环中,那么建议将这个函数声明为内联,可以提高程序的运行效率
记住,调用函数的开销是很大的,所谓的空间开销是指调用函数前,先要将原来的函数保存在寄存器(占用寄存器空间)里面,并在调用结束后恢复。调用函数时,还要复制实参(占用内存空间)。如果被调用函数一旦调用频繁,就会花费很多空间。如果你有一段“短小而频繁调用的函数”,内联是个不错的选择。
23 虚函数虚函数是C++的精华,也是java多态的前身。virtual
虚函数为了重载和多态的需要,在基类中是由定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数!
纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!
虚函数引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。
24 输入25 初始化列表 初始化列表就是在实例化对象的时候,可以显示的调用父类的构造方法,传递参数给父类,也可以对本身的属性进行赋值。
26 多继承如果B1和B2有相同的属性,这样如果调用是会出现错误的,如果有就只能选择虚继承。
必须要显示的指定访问作用域
27 虚继承虚拟继承,和普通继承是C++的两种继承方式。
例如B1、B2 继承A 而C多重继承B1、B2
如果普通继承则C包含两份A的拷贝,分别来自于B1、B2
而虚拟继承则只包含一份A的拷贝
虚基类是指:class SubClass : virtual public BaseClass 中以virtual声明的基类!!由于C++支持多重继承,所以对于一个派生类中有几个直接父类,而几个直接父类中有几个可能分别继承自某一个基类(就是父类的父类),这样在构造最终派生类时,会出现最终派生类中含有多个同一个基类的情况,就会产生二义性的问题(不知道该调用哪个基类的成员变量和函数),为解决此问题,需要使用虚基类,即只对此基类生成一块内存区域,这样最终派生类中就只会含有一个基类了
典型的需要用虚基类的情况如下:
A
/ \
B C
\ /
D
如果是虚继承,在子类实例化的时候是不会调用父类的构造方法,必须显示的调用。
#include <iostream>
using namespace std;
class A
{
public:
A(int a = 0):mA(a) {}
int mA;
};
class B1 : virtual publicA
{
public:
B1(int a = 0, int b = 0) : A(b), mB1(a) {}
int mB1;
};
class B2 : virtualpublic A
{
public:
B2(int a = 0, int b = 0) : A(b), mB2(a) {}
int mB2;
};
class C : public B1, public B2
{
public:
C(int x, int a, int b, int c, int d) : A(b),B1(a,b), B2(c, d), mC(x) {}
void Print()
{
cout << "B1::mA = " << B1::mA<< endl;
cout << "B2::mA = " << B2::mA << endl;
cout << "mA = " << mA << endl;
cout << "mB1 = " << mB1 << endl;
cout << "mB2 = " << mB2 << endl;
cout << "mC = " << mC << endl;
}
int mC;
};
int main()
{
Cobj(10, 20, 30, 40, 50);
obj.Print();
system("pause");
return 0;
}
希望大家积极转发、分享,让更多的人轻松学习!