C++继承学习过程

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时要初始化,也就是要分配内存,而这个内存可以由子类共享。

猜你喜欢

转载自blog.csdn.net/domoNaruto/article/details/83214426