1.继承的三种方式
class Parent
{
public:
int p_a;
Parent()
{
p_a = 2;
p_b = 5;
p_c = 3;
}
private:
int p_b;
protected:
int p_c;
};
// 公有继承
class Child1:public Parent
{
public:
void printC()
{
cout << p_a << endl; //ok 基类的公有成员在派生类中为公有成员
//cout << p_b << endl; //error 基类中私有成员在派生类中是不可见的
cout << p_c << endl; //ok 基类的保护成员在派生类中为保护成员
}
};
// 私有继承
class Child2:private Parent
{
public:
void printC()
{
cout << p_a << endl; //ok 基类的公有成员在派生类中为私有成员
//cout << p_b << endl; //error 基类中私有成员在派生类中是不可见的
cout << p_c << endl; //ok 基类的保护成员在派生类中为私有成员
}
};
// 保护继承
class Child3:protected Parent
{
public:
void printC()
{
cout << p_a << endl; //ok 基类的公有成员在派生类中为保护成员
//cout << p_b << endl; //error
cout << p_c << endl; //ok 基类的保护成员在派生类中为保护成员
}
};
一般继承使用的大多是第一种公有继承,另两种只有在一些时候会使用。
小知识:
子类对象可以当作父类对象使用
子类对象可以直接赋值给父类对象
子类对象可以直接初始化父类对象
父类指针可以直接指向子类对象
父类引用可以直接引用子类对象
2.继承的构造与析构
class parent
{
public:
parent()
{
cout << "我是父类" <<endl;
p_i = 1;
}
void printC()
{
cout << p_i << endl;
}
private:
int p_i;
};
class child : public parent
{
public:
child()
{
c_i = 2;
cout << "我是子类" << endl;
}
void printD()
{
cout << c_i << endl;
}
private:
int c_i;
};
void main()
{
parent p1;
child c1;
c1.printC();
}
运行结果:
我是父类 我是父类 我是子类 1
可以理解为,在子类继承父类时,继承了父类里面的内容,但是私有不可见。在初始化子类时,先构造父类,然后进行了子类的 构造。
3.同名与static
child c1;
c1.print1();
c1.parent::print1();
当子类函数或变量和父类函数或变量同名时,子类函数会覆盖父类的函数。如果要调用父类的函数,则需要指明。
然后是static 的问题,父类的static成员与子类static 成员共享同一内存空间。
class parent
{
public:
static void setI()
{
i++;
cout << i << endl;
}
private:
static int i;
};
int parent::i = 1;
class child : public parent
{
public:
private:
};
int main()
{
child c;
c.setI();
parent::setI();
return 0;
}
结果为: 2 3
分析: 在声明static时要初始化,也就是要分配内存,而这个内存可以由子类共享。