子类在继承时可以选择public,protected,private三种方式去继承。这三种方式都将继承父类的所有函数成员(除过构造函数和析构函数)和数据成员,但是继承以后的访问控制权限会发生变换。
首先我们给出一个父类。来看看子类的继承方式是否影响它继承父类的所有函数成员(除过构造函数和析构函数)和数据成员。
由于成员函数存储在代码段,类的大小仅仅指类的数据成员的大小。我们从类的大小上来说明子类会继承父类的所有函数成员(除过构造函数和析构函数)和数据成员。在public,protected,private下面都放一个变量,来让测试说明问题。
#pragma once
#include <iostream>
using namespace std;
class Parent
{
public:
double x;
protected:
double b;
private:
double c;
};
class Child1 : public Parent
{
public:
protected:
private:
};
class Child2 : protected Parent
{
public:
protected:
private:
};
class Child3 : private Parent
{
public:
protected:
private:
};
#include"标头.h"
int main()
{
cout << "Parent的大小:" << sizeof(Parent) << endl;
cout << "Child1的大小:" << sizeof(Child1) << endl;
cout << "Child2的大小:" << sizeof(Child2) << endl;
cout << "Child3的大小:" << sizeof(Child3) << endl;
return 0;
}
测试结果:
可以看到无论是什么继承方式,子类都会继承父类的所有函数成员(除过构造函数和析构函数)和数据成员。
那么这三种继承方式有什么不同呢?
public继承: 继承以后父类的public成员在子类仍旧是public成员,父类的protected成员在子类仍旧是protected成员。 父类的private成员在子类中不可访问。
protected继承: 继承以后父类的public成员在子类中变成protected成员,父类的protected成员在子类仍旧是protected成员 。父类的private成员在子类中不可访问。
private继承: 继承以后父类的public成员在子类中变成private成员,父类的protected成员在子类中变成private成员 ,父类的private成员在子类中不可访问。